2

float 값 (또는 메모리에서 연속되는 바이트)의 원시 바이트를 표시하는 아주 간단한 솔루션을 원합니다. 내 이해에서, 이것은 캐스팅 (값을 읽고이를 바이트로 해석)하는 것으로 오해하지 않도록 typecasting (메모리 값을 바이트로 읽음)이라고합니다. float (64)를 바이트로 변환하는 파이썬 경량 솔루션

간단한 테스트

는 것 같다 :

import numpy 
a=3.14159265 
print(a.hex()) 
# Returns 0x1.921fb53c8d4f1p+1 
b=numpy.array(a) 
print(b.tobytes()) 
# returns b'\xf1\xd4\xc8S\xfb!\[email protected]' 
# expected is something like 'F1' 'D4' 'C8' '53' 'FB' '21' '09' '40' 

는하지만 방법 헥스()는 16 진수로 IEEE FLOAT의 represantation의 해석을 반환합니다. 두 번째 방법은 4 개의 16 진수 마커 \x을 보여 주지만 float64는 8 바이트를 읽어야하므로 궁금합니다. 나는 다른 캐릭터들에 대해서 궁금해한다.
좋은 오래된 단순한 CI는 단순히 float의 메모리 주소에 부호없는 int 포인터를 사용하고 해당 unsigned int "Array"(포인터)에서 8 개의 값을 인쇄함으로써 구현했을 것입니다.
저는 C 파이썬에서 -하지만 다른 간단한 솔루션이 있습니까?
아마도 관심의 대상입니다. 많은 대형 플로트 벡터를 BLOB에 저장하여 데이터베이스에 저장해야합니다.

내가 생각하는 유사한 문제는 Correct interpretation of hex byte, convert it to float에서 가능한 경우 (표시 가능한 문자)는 \x -form에 인쇄되지 않습니다. 어떻게 바꿀 수 있습니까?

답변

3

내장형 모듈 struct을 사용할 수 있습니다. 나중에 파이썬 3.5 이상이있는 경우 :

import struct 
struct.pack('d', a).hex() 

이 제공 :

import binascii 
binascii.hexlify(struct.pack('d', a)) 

또는 :

hex(struct.unpack('>Q', struct.pack('d', a))[0]) 

하면

'f1d4c853fb210940' 

이 3.5보다 오래된 파이썬이있는 경우 수레 배열이있어서 NumPy를 사용하고 싶습니다 :

import numpy as np 
np.set_printoptions(formatter={'int':hex}) 
np.array([a]).view('u8') 
관련 문제