Ваш int(''.join([str(ord(i)) for i in some_value]))
работает ТОЛЬКО когда все байты, кроме последнего, равны нулю.
Примеры:
'\x01I'
должно быть 1 * 256 + 73 == 329; вы получите 173
'\x01\x02'
должно быть 1 * 256 + 2 == 258; вы получите 12
'\x01\x00'
должно быть 1 * 256 + 0 == 256; вы получите 10
Это также основывается на предположении, что целые числа хранятся в бигендовском стиле; Вы подтвердили это предположение? Вы уверены, что '\x00I'
представляет целое число 73, а не целое 73 * 256 + 0 == 18688 (или что-то еще)? Позвольте нам помочь вам подтвердить это предположение, сообщив нам, какую марку и модель компьютера и какую операционную систему использовали для создания данных.
Как представлены отрицательные целые числа?
Вам нужно иметь дело с числами с плавающей точкой ?
Является ли требование написать его на C ++ неизменным? Что означает "(ROOT, в частности)"?
Если единственным диктатом является здравый смысл, предпочтительный порядок будет:
Напишите это на Python, используя модуль struct.
Напишите его на C ++, но используйте подпрограммы библиотеки C ++ (особенно, если используется плавающая точка). Не изобретай велосипед заново.
Сверните свои собственные процедуры преобразования в C ++. Вы можете получить копию источника C для структурного модуля Python .
Обновление
Комментарии после публикации информации о формате файла:
Маркер порядка байтов, по-видимому, необязателен, за исключением начала файла. Это хитроумно; он основан на том факте, что если его там нет, 3-й и 4-й байты блока являются первыми 2 байтами строки заголовка, и ни '\x03\x04'
, ни '\x02\x01'
не могут правильно запустить строку заголовка. Умнее всего было бы прочитать SIX байтов - если первые 4 - это маркер байтов, следующие два - это длина заголовка, а следующее чтение - для строки заголовка; в противном случае ищите назад 4 байта, затем читайте строку заголовка.
Выше в категории неприятности. Отрицательные размеры вызывают серьезную обеспокоенность, поскольку в них указывается МАКСИМАЛЬНАЯ длина, и нет упоминания о том, как определяется ФАКТИЧЕСКАЯ длина. Там написано: «Фактический размер записи задается построчно». Как? Нет документации о том, как выглядит «строка данных». В описании много раз упоминаются «строки»; заканчиваются ли эти строки возвратом каретки и / или переводом строки? Если так, как можно определить разницу между, скажем, байтом перевода строки и первым байтом, скажем, uint16, который принадлежит текущей «строке» данных? Если нет перевода строки или что-то еще, как узнать, когда закончится текущая строка данных? Есть ли размер uintNN перед каждой переменной или ее частью?
Тогда говорится, что (2) выше (отрицательный размер) также относится к строке заголовка. Разум поражает. Есть ли у вас примеры (в документации по разметке файлов или в реальных файлах) "отрицательного размера" (а) строки заголовка (б) "строки данных"?
Является ли этот «определенный формат» общедоступным, например, документация в сети? У формата есть имя для поиска? Вы уверены, что вы первый человек в мире, который хочет прочитать этот формат?
Чтение этого формата файла, даже с полной спецификацией, не является тривиальным упражнением, даже для опытного в двоичном формате человека, который также имеет опыт работы с Python (у которого BTW не имеет float128). Сколько человеко-часов было выделено для выполнения задачи? Каковы штрафы за (а) задержку (б) неудачу?
Ваш первоначальный вопрос заключался в исправлении вашего интересного способа разбора uint16 - делать гораздо больше - это выходит за рамки / цели того, что представляют собой вопросы SO.