После просмотра многих похожих вопросов я написал что-то, что, надеюсь, сделает то, что я хотел.
f = 1.00
negative = False
if f < 0:
f = f*-1
negative = True
s = struct.pack('>f', f)
p = struct.unpack('>l', s)[0]
hex_data = hex(p)
scale = 16
num_of_bits = 32
binrep = bin(int(hex_data, scale))[2:].zfill(num_of_bits)
if negative:
binrep = '1' + binrep[1:]
binrep
- результат. Каждая часть будет объяснена.
f = 1.00
negative = False
if f < 0:
f = f*-1
negative = True
Преобразует число в положительное, если отрицательное, и устанавливает переменную отрицательную в значение false. Причина этого заключается в том, что разница между положительными и отрицательными двоичными представлениями находится только в первом бите, и это был более простой способ, чем выяснить, что происходит не так, когда весь процесс обрабатывается с отрицательными числами.
s = struct.pack('>f', f) #'?\x80\x00\x00'
p = struct.unpack('>l', s)[0] #1065353216
hex_data = hex(p) #'0x3f800000'
s
является шестнадцатеричным представлением двоичного файла f
. это, однако, не в симпатичной форме, в которой я нуждаюсь. То, где p входит. Это int-представление шестнадцатеричных s. А затем другое преобразование, чтобы получить симпатичный гекс.
scale = 16
num_of_bits = 32
binrep = bin(int(hex_data, scale))[2:].zfill(num_of_bits)
if negative:
binrep = '1' + binrep[1:]
scale
является базой 16 для шестнадцатеричного. num_of_bits
равно 32, так как float 32 бита, он используется позже, чтобы заполнить дополнительные места 0, чтобы добраться до 32. Получил код для binrep
из этого вопроса . Если число было отрицательным, просто измените первый бит.
Я знаю, что это уродливо, но я не нашел приятного пути, и мне это было нужно быстро. Комментарии приветствуются.