Pythonでは、フロートの束を16進数に変換する必要があります。ゼロパッドする必要があります(たとえば、0x10ではなく0x00000010)。 http:// gregstoll。 dyndns.org/~gregstoll/floattohex/ あり(残念ながら、自分のプラットフォームでは外部ライブラリを使用できないため、そのWebサイトで提供されているものを使用できません)
これを行う最も効率的な方法は何ですか?
これは、浮動小数点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の文字列。
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の記事 を参照してください。
さらに 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
あなたがマイクロパイソンを使っているなら(これは質問には言われていませんが、見つけるのに苦労しました)これを使うことができます
import struct
import binascii
def float_to_hex(f):
binascii.hexlify(struct.pack('<f', f))
float_to_hex(17.5) # 0x418c0000