2014-11-14 8 views
0

int 목록으로 저장된 숫자를 부동 소수점 유형으로 변환하려고합니다. 나는 시리얼 콘솔을 통해 그 번호를 얻었고 다시 그것을 플로트로 재구성하려고한다.정수 목록을 부동 소수점으로 변환

result = int_list[0]*256.0 + int_list[1] 

그러나,이 부호가 유지되지 않습니다 내가 파이썬에서 사용하려고 무엇

bit_data = ((int16_t)byte_array[0] << 8) | byte_array[1]; 
result = (float)bit_data; 

가 훨씬 더 간단 전환이다 : 나는 C에서 그것을 할 것 방법은 다음과 같이이다 그 결과는 C 코드와 같습니다. 파이썬에서이 작업을 수행하는 올바른 방법은 무엇입니까?

업데이트 : 파이썬 버전은 2.7.3입니다. 내 바이트 배열의 길이는 2입니다. 파이썬 코드의 입니다. byte_array는 int의 목록입니다. 오해를 피하기 위해 이름을 변경했습니다. float() 함수는 숫자의 부호를 유지하지 않기 때문에 사용할 수 없습니다.

+0

당신의 byte_array이 얼마나 큰 -2.0? 그것은 4 요소입니까? 귀하의 코드는 분명히하지 않습니다 ... –

+0

또한, 당신은 어떤 파이썬 버전을 언급하지 않았다 ... –

+1

byte_array는 무엇입니까? int, bytes 객체의 목록입니까? – Dunes

답변

2

나는 당신이 가지고있는 데이터와 파이썬에서 어떻게 표현되어 있는지 혼란 스럽다. 필자가 이해할 수 있듯이 직렬 연결을 통해 부호없는 두 바이트를 받았다. 이제는 두 개의 파이썬 int 목록으로 표시된다. 이 데이터는 빅 엔디안 16 비트 부호있는 정수를 나타내며이를 추출하여 float로 변환합니다. 예.[0xFF, 0xFE] ->-2 ->

import array, struct 

two_unsigned_bytes = [255, 254] # represented by ints 
byte_array = array.array("B", two_unsigned_bytes) 
# change above to "b" if the ints represent signed bytes ie. in range -128 to 127 
signed_16_bit_int, = struct.unpack(">h", byte_array) 
float_result = float(signed_16_bit_int) 
+1

나는 hadn ' t는 바이트 배열로 변환하는 것을 고려했다. .. 매우 시원한. 나는 빅 엔디안이라고 생각한다. 그래서 "> h". '[255, 255] '이외의 다른 예는 더 명확하게 보여줍니다. – tdelaney

+0

감사! 이 하나가 가장 잘 어울립니다! – Egor

+0

@tdelaney endianness에 대한 호명. 나는 데이터의 부호에 매달려 있었고 값이 다른 바이트 패턴을 생각하려고 시도했지만 부호가있는 int와 부호가없는 int 모두 분명했다. – Dunes

2

나는 당신이하고있는 일을 정말로 이해하고 있는지 모르지만, 당신은 스트림에서 4 바이트를 얻었고 float32 값을 나타낼 수 있다고 생각합니다. 이것을 처리하는 방식은 빅 엔디 언 바이트 순서를 제안합니다.

파이썬은 바이트 스트림을 처리하기 위해 struct 패키지 (https://docs.python.org/2/library/struct.html)를 가지고 있습니다.

import struct 

stream = struct.pack(">f", 2/3.) 
len(stream) # 4 

reconstructed_float = struct.unpack(">f", stream) 
+0

빠른 답변 주셔서 감사합니다! 파이썬을 처음 사용하므로 조금만 시간을 들여 이해하고 사용해보십시오. – Egor

2

내가 원하는 것은 struct module입니다.

import struct 
sampleValue = 42.13 
somebytes = struct.pack('=f', sampleValue) 
print(somebytes) 
result = struct.unpack('=f', somebytes) 
print(result) 

result

당신에게 놀라운 일이 될 수있다 :

여기에 왕복 조각입니다. unpack은 튜플을 반환합니다. 그래서 당신은

result[0] 

을 할 수있는 값을 얻거나 개인적으로 싫어

result = struct.unpack('=f', some bytes)[0] 

로 결과 설정 줄을 수정, 그래서 대신

result , = struct.unpack('=f', some bytes) # tuple unpacking on assignment 

두 번째를 다음과 같이 사용하는 주목할 점은 값에 노이즈가 추가로 발생한다는 것입니다. 이것은 파이썬의 네이티브 부동 소수점 표현이 double이기 때문입니다.

+0

빠른 답변 감사합니다! 그것을 밖으로 시도하고 이해하는 데 약간의 시간이 필요합니다. – Egor

+0

환영합니다. 재미 있고 유용한 언어입니다. –

+0

구조체 모듈이 반 정밀도 부동 소수점 형식을 알 수 없다는 점을 지적 해 두는 것이 좋습니다. . –

1

가 좋아 (이 python3이 BTW, 적절한 파이썬의 이전 버전을 사용하는 조정이다), 그래서 나는 int_list 정말 int 치의 단지 목록이 아닙니다 생각합니다. int는 0-255로 제한되며 부호가있는 정수로 빌드 될 수있는 바이트를 나타냅니다. 그런 다음 그것을 플로트로 바꾸고 싶습니다. 트릭은 첫 번째 바이트의 부호를 올바르게 설정 한 다음 수행 한 것과 매우 유사합니다.

float((-(byte_array[0]-127) if byte_array[0]>127 else byte_array[0])*256 + byte_array[1]) 
관련 문제