From b32c7a1b080cb5d14f242070bf906ea6929d604d Mon Sep 17 00:00:00 2001 From: Mattias Ellert Date: Fri, 25 Mar 2022 11:13:12 +0100 Subject: [PATCH] Byte swap values read from the protobuf raw data stream on big endian --- tmva/sofie_parsers/src/RModelParser_ONNX.cxx | 23 +++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/tmva/sofie_parsers/src/RModelParser_ONNX.cxx b/tmva/sofie_parsers/src/RModelParser_ONNX.cxx index ab457dcddc..d701fb3299 100644 --- a/tmva/sofie_parsers/src/RModelParser_ONNX.cxx +++ b/tmva/sofie_parsers/src/RModelParser_ONNX.cxx @@ -1,3 +1,4 @@ +#include "Byteswap.h" #include "TMVA/RModelParser_ONNX.hxx" #include "onnx_proto3.pb.h" @@ -335,9 +336,14 @@ RModel RModelParser_ONNX::Parse(std::string filename, bool verbose) case ETensorType::FLOAT: { std::shared_ptr data(malloc(fLength * sizeof(float)), free); - if (tensorproto->raw_data().empty() == false) { - auto raw_data_ptr = reinterpret_cast(const_cast(tensorproto->raw_data().c_str())); - std::memcpy(data.get(), raw_data_ptr, fLength * sizeof(float)); + if (!tensorproto->raw_data().empty()) { +#ifdef R__BYTESWAP + std::memcpy(data.get(), tensorproto->raw_data().c_str(), fLength * sizeof(float)); +#else + for (std::size_t k = 0; k < fLength; ++k) + (reinterpret_cast(data.get()))[k] = + Rbswap_32((reinterpret_cast(tensorproto->raw_data().c_str()))[k]); +#endif } else { tensorproto->mutable_float_data()->ExtractSubrange(0, tensorproto->float_data_size(), static_cast(data.get())); @@ -350,9 +356,14 @@ RModel RModelParser_ONNX::Parse(std::string filename, bool verbose) case ETensorType::INT64: { std::shared_ptr data(malloc(fLength * sizeof(int64_t)), free); - if (tensorproto->raw_data().empty() == false) { - auto raw_data_ptr = reinterpret_cast(const_cast(tensorproto->raw_data().c_str())); - std::memcpy(data.get(), raw_data_ptr, fLength * sizeof(int64_t)); + if (!tensorproto->raw_data().empty()) { +#ifdef R__BYTESWAP + std::memcpy(data.get(), tensorproto->raw_data().c_str(), fLength * sizeof(int64_t)); +#else + for (std::size_t k = 0; k < fLength; ++k) + (reinterpret_cast(data.get()))[k] = + Rbswap_64((reinterpret_cast(tensorproto->raw_data().c_str()))[k]); +#endif } else { tensorproto->mutable_int64_data()->ExtractSubrange(0, tensorproto->int64_data_size(), static_cast(data.get())); -- 2.39.2