web-dev-qa-db-ja.com

フロートを16進数に変換する方法

Pythonでは、フロートの束を16進数に変換する必要があります。ゼロパッドする必要があります(たとえば、0x10ではなく0x00000010)。 http:// gregstoll。 dyndns.org/~gregstoll/floattohex/ あり(残念ながら、自分のプラットフォームでは外部ライブラリを使用できないため、そのWebサイトで提供されているものを使用できません)

これを行う最も効率的な方法は何ですか?

19
user2339945

これは、浮動小数点valueを(16進数)整数に変換することを目的としていないため、Pythonでは少しトリッキーです。代わりに、16進数としての浮動小数点値の解釈IEEE 754 バイナリ表現を試みています。

組み込みの pack ライブラリのunpack関数とstruct関数を使用します。

floatは32ビットです。まず、バイナリにpackします1 文字列、次にunpackとしてintとして。

def float_to_hex(f):
    return hex(struct.unpack('<I', struct.pack('<f', f))[0])

float_to_hex(17.5)    # Output: '0x418c0000'

doubleも64ビットであることがわかっているため、同じことができます。

def double_to_hex(f):
    return hex(struct.unpack('<Q', struct.pack('<d', f))[0])

double_to_hex(17.5)   # Output: '0x4031800000000000L'

1-生バイトの文字列を意味します。 not1と0の文字列。

38

Python floatは常に倍精度です。

回答を16進整数の形式で出力する必要がある場合、質問はすでに回答されています。

import struct

# define double_to_hex as in the other answer

double_to_hex(17.5)   # Output: '0x4031800000000000'
double_to_hex(-17.5)  # Output: '0xc031800000000000'

ただし、代わりに組み込み関数の使用を検討することもできます。

(17.5).hex()    # Output: '0x1.1800000000000p+4'
(-17.5).hex()   # Output: '-0x1.1800000000000p+4'

# 0x1.18p+4 == (1 + 1./0x10 + 8./0x100) * 2**4 == 1.09375 * 16 == 17.5

これは以前と同じ答えですが、より構造化された人間が読める形式になっています。

下位52ビットは仮数です。上位12ビットは、符号ビットと11ビットの指数で構成されます。指数バイアスは1023 == 0x3FFなので、0x403は「4」を意味します。 IEEE浮動小数点に関するWikipediaの記事 を参照してください。

14
ghostarbeiter

さらに Jonathon Reinhart's 非常に役立ちます answer 。 UDPを介して浮動小数点数をバイトとして送信するには、これが必要でした

import struct

# define double_to_hex (or float_to_hex)
def double_to_hex(f):
    return hex(struct.unpack('<Q', struct.pack('<d', f))[0])

# On the UDP transmission side
doubleAsHex = double_to_hex(17.5)
doubleAsBytes = bytearray.fromhex(doubleAsHex.lstrip('0x').rstrip('L'))

# On the UDP receiving side
doubleFromBytes = struct.unpack('>d', doubleAsBytes)[0] # or '>f' for float_to_hex
5
Ken

あなたがマイクロパイソンを使っているなら(これは質問には言われていませんが、見つけるのに苦労しました)これを使うことができます

import struct
import binascii
def float_to_hex(f):
    binascii.hexlify(struct.pack('<f', f))
float_to_hex(17.5) # 0x418c0000
1
Kevin Cando