Blob Blame History Raw
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