3

Я пытаюсь проанализировать старый двоичный формат, который не имеет каких-либо спецификаций. Я понял, что существует массив из 96 чисел с плавающей запятой, каждый из которых имеет длину 4 байта.Кодирование чисел с плавающей запятой с обратным проектированием

Я потратил много времени на различные шестнадцатеричные инструменты, но без везения. Я не мог найти ни одной картины. Поэтому я подозреваю, что это какое-то необычное представление с плавающей точкой, а не какой-то стандарт, например IEEE-754.

Вот длинный список примеров, как байты карты плавать значение: https://gist.github.com/anonymous/e67dd27706ba1f289a895fef70399dc9

Несколько примеров:

80 00 00 80 = 0 
00 FF 00 00 = 0 
B8 EB 83 43 = 1.86281420496466 
F8 AF 86 43 = 1.9018805660946 
7B C2 F2 43 = 3.42793766176755 
37 43 F5 43 = 3.46327992859723 
6A 4D 03 44 = 3.70816455369089 
26 C6 0A 44 = 3.919173581123 
AF C3 79 43 = 1.76342447568475 

Я в состоянии обеспечить значение с плавающей точкой для любого байта комбинации, которые могут быть полезны для анализ.

Не могли бы вы помочь мне выяснить формулу, как преобразовать эти необработанные байты в float?

+0

Каковы значения с плавающей точкой для '00 00 00 43',' 01 00 00 43', '02 00 00 43' и' 00 00 00 44'? –

+0

Вот значения: '00 00 00 43 = 0.903725041656076' ' 01 00 00 43 = 0.903725149388496' '02 00 00 43 = 0.903725257120917' ' 00 00 00 44 = 3.6149001666243' еще один вещь, все данные представлены в порядке из файла, возможно, они должны быть отменены для анализа. – pliber

+0

@pliber Скорее всего, это примеры отрицательных операндов, а также очень большие и очень маленькие (по величине), а также примеры через несколько * последовательных * бинад (например, в [1,2], [2, 4] , [4, 8], [8, 16], [16, 32]. – njuffa

ответ

4

Сортируя значения, то ясно, что порядок байт поменялся (так +1,86281420496466 действительно 43 83 EB B8.

Plotting эти шестнадцатеричные значения от значения с плавающей точкой показывают, что она линейна после 9-го бита, поэтому бит 10- 32, как представляется, мантиссы с неявной ведущего бита (m).

Первый бит, то, как представляется, знак (1 для отрицательных, 0 для положительных).

Биты с 2 по 9 оказаться смещенный показатель (e)

В общем виде числа тогда:

знак e -13 × 0,903725041656076 × (1 + m/2)

Если смещенная показатель равен нулю, то само значение равно нулю.

Я не уверен, почему там есть забавная константа.

ОБНОВЛЕНИЕ: Кажется, что он соответствует бинарнику IEEE754, если умножен на 141.636, кроме обработки нуля (т. Е. Сбрасывает субнормальное значение на ноль).

В Джулии, конверсия может быть сделано как:

julia> reinterpret(UInt32,Float32(1.86281420496466*141.636)) # float to hex 
0x4383ebb8 

julia> reinterpret(Float32,0x4383ebb8)/141.636 # hex to float 
1.862814204964663 
+0

Что не имеет смысла для двоичного формата, так это то, что 1.76 .. и 3.46 .. должны делиться одним и тем же значением «показательный байт», а именно «0x43». Мне интересно, можно ли здесь использовать более высокий радиус, чем 2. – njuffa

+0

njuffa: Я попытаюсь создать больше чисел из диапазонов, упомянутых в вашем предыдущем комментарии. Спасибо Саймону, я должен подумать об этой странной константе. Я проверил, и первый бит действительно знаком (1 отрицательный, 0 положительный) – pliber

+0

Саймон, 'x' должен быть 'e' в вашем уравнении? Я прав? – pliber