Я генерирую двоичные файлы для использования в модульных тестах, которые имитируют сеть. Некоторые из данных, отправленных по сети, находятся в режиме Little Endian или Big Endian, и я хотел бы имитировать эти данные с помощью заглушки и создания двоичных файлов.Преобразование массива float в little/big endian
Другими словами, вместо использования активной сети для моих модульных тестов я бы сгенерировал двоичные файлы, содержащие эквивалентные данные, которые я ожидал бы от сетевых сокетов.
Я использую Python 2.7 для генерации массивов байтов и сохранения их в файлах, но у меня возникли проблемы с преобразованием моего массива с плавающей точкой в режим little endian.
from array import array
output_file = open(r"C:\temp\bin.dat", "wb")
float_array = array('d', [1, 1.2, 0.34, 9.8, 0.13, 1.1, 0.88, 72])
float_array.byteswap(); #This doesn't convert it to little endian!
float_array.tofile(output_file)
output_file.close()
Так что я интересно, если кто-нибудь знает, как от, как манипулировать массив таким образом, что, когда я float_array.tofile()
он будет записывать двоичные данные в маленьком/режиме большой Endian.
Этот код дает следующий результат:
Val = 8.6184E-41
Val = 0.0
Val = 4.1897916E-8
Val = 4.172325E-8
Val = -1.9212016E-29
Val = -490.3153
Val = -1.5834067E-23
Который не соответствует разыскиваемых array('d', [1, 1.2, 0.34, 9.8, 0.13, 1.1, 0.88, 72])
Когда я закомментировать метод byteswap
, я получаю следующее
Val = 0.0
Val = 1.875
Val = 4.172325E-8
Val = 1.9
Val = 1.9023206E17
Val = 1.67
Val = -1.5881868E-23
Однако , в реальном сетевом режиме он отлично работает. Но это не помогает при модульном тестировании!
Я смущен. Где вы получаете эти строки «Val = 0.0»? Когда я запускаю свой код, я получаю двоичные файлы, а не что-то в этом формате. И первые 8 байтов являются «0, 0, 0, 0, 0, 0, 240, 63', если они не заменены,' 63, 240, 0, 0, 0, 0, 0, 0', если они меняются местами. Возможно ли, что файлы написаны очень хорошо, но код, который вы используете для их чтения и отображения и/или повторного массива-ify (который вы нам не показали), неверен? – abarnert