2012-07-31 5 views
1

안녕하세요. -0.000000e + 00 (Windows의 경우) 구문 분석에 문제가 있습니다.Python -0.000000e + 00 struct pack이 잘못된 값을 반환합니다.

struct.pack("d", -0.000000e+00) 

리눅스 struct.pack 변경 -0.000000e + 00 - 0.000000e + 00. 팩이 정확하기 전에 값을 출력하지만 struct.pack의 결과는 0.000000e + 00과 같습니다.

이 문제를 해결할 수있는 방법이 있습니까?

나는 마술사가 0에 가장 가까운 음수를 추가 할 필요가 있다고 생각합니다. 어떻게해야합니까?

EDIT struct.pack("d", -0.000000e+00) 결과 '\ x00에서 \ x00에서 \ x00에서 \ x00에서 \ x00에서 \ x00에서 \ x00에서 \ X80'

struct.pack("!d", -0.000000e+00) 결과 '\ x00에서 \ x00에서 \ x00에서 \ x00에서 \ x00에서 \ x00에서 \ x00에서 \ x00에서'

struct.pack("<d", -0.000000e+00) 결과 '\ x00에서 \ x00에서 \ x00에서 \ x00에서 \ x00에서 \ x00에서 \ x00에서 \ x00부터'

struct.pack(">d", -0.000000e+00) 결과 '\ x00에서 \ x00에서 \ x00에서 \ x00에서 \ x00에서 \ x00에서 \ x00에서 \ x00부터' I "< d"와 "> d"를 사용하고 싶습니다.

EDIT Sry 오류가 아닙니다.

+0

[사용중인 코드] (http://sscce.org/)를 게시하십시오. 이 질문에 대해서는 CPU 아키텍처가 적절할 수도 있습니다. 'struct.unpack ('d', struct.pack ("d", -0.000000e + 00)) [0]'리눅스/amd64에서 cpython 3.2와 2.7로 잘 작동합니다. – phihag

답변

1

구조체 형식 문자열 "d"은 플랫폼 고유의 방식으로 값을 인코딩합니다. 대부분의 경우, 바이트 테스트를 디코딩하는 플랫폼은 endianess 또는 길이가 두 배가 다릅니다. 플랫폼 독립적 인 인코딩을 강제로 ! 형식 문자를 사용

>>> struct.pack('!d', -0.) 
b'\x80\x00\x00\x00\x00\x00\x00\x00' # IEEE754 binary64 Big Endian 
>>> struct.unpack('!d', b'\x80\x00\x00\x00\x00\x00\x00\x00')[0] 
-0.0 

이 또한 지원되는 파이썬 버전을 사용하는 것이 있는지 확인하십시오. cPython < 2.5에서는 struct가 버그가있는 것으로 알려져 있습니다. 2.7 또는 3.2와 같은 최신 버전으로 업데이트하십시오.

+0

그것은 나를 위해 작동하지 않습니다 : (Return \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 – Luffy

+0

@Luffy 위의 코드를 사용했는지 반드시 확신합니까? [pastebin] (http://pastebin.com) 정도가 되었습니까? 그리고 어떤 아키텍처, 리눅스 배포판, Python 버전을 테스트하고 있습니까? 또한 디코딩 할 때'! '를 사용해야합니다. – phihag

+0

Python 2.4.3 아키텍처가 무엇인지 모르겠다. (공통적이지는 않다.) – Luffy