From d9e03aad7a5132fe9db9992eecb47ee4e91c354c Mon Sep 17 00:00:00 2001
From: Mattias Ellert <mattias.ellert@physics.uu.se>
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 | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/tmva/sofie_parsers/src/RModelParser_ONNX.cxx b/tmva/sofie_parsers/src/RModelParser_ONNX.cxx
index 3b0a30cdb0..23e41d746f 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"
@@ -980,9 +981,14 @@ RModel RModelParser_ONNX::Parse(std::string filename){
//void* data = malloc (fLength * sizeof(float));
std::shared_ptr<void> data(malloc(fLength * sizeof(float)), free);
- if (tensorproto->raw_data().empty() == false){
- auto raw_data_ptr = reinterpret_cast<float*>(const_cast<char*>(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<UInt_t*>(data.get()))[k] =
+ R__bswap_32((reinterpret_cast<const UInt_t*>(tensorproto->raw_data().c_str()))[k]);
+#endif
}else{
tensorproto->mutable_float_data()->ExtractSubrange(0, tensorproto->float_data_size(), static_cast<float*>(data.get()));
}
--
2.35.1