2014-03-06 3 views
4

정수를 사용하여 (예 : -200) 16 진수 (FF 38)로 변경 한 다음 직렬로 전송하려면 정수 0-255로 변환해야합니다. 내가 주어진 예제했다 : 나는 struct.pack('>h', -200)를 사용하여 시도했지만 그게 잘못된 값을 반환정수를 2 바이트의 16 진수로 파이썬으로 변환

-200 = hex FF38 = [hex FF] [hex 38] = [255] [56] 

. 나는 또한 hex()을 시도했으나 부정확 한 16 진수 값을 반환했습니다.

내가 무엇을 시도해야하는지 모르겠다.

+0

십진 정수'b'255 '(3 바이트) 또는 단지 a 바이트를 보내야합니까 :'b '\ xff'' (1 바이트)? – jfs

답변

3
>>> hex(struct.unpack('>H', struct.pack('>h', -200))[0]) 
'0xff38' 

먼저, 팩 -200 A와는 INT 짧은 2 바이트를 체결했다. 그런 다음 데이터를 부호없는 2 바이트 short int으로 압축을 풉니 다. 이것은 어느 hex0-255 정수를 전송해야하는 경우 ff38


이 더 잘 작동 할 수있다, 당신에게 65,336을 제공합니다

>>> struct.unpack('>BB', struct.pack('>h', -200)) 
(255, 56) 
>>> struct.unpack('>BB', struct.pack('>h', 200)) 
(0, 200) 

을 두 부호 문자로 풀고있는 경우


필수 사항 documentation on struct

+0

이것은 양수에 대해서는 효과가 있지만 음수는 어떻게됩니까? 나는 200과 -200을 시도했고 같은 것을 얻었다. –

+0

당신은 안됩니다 ... 나는 각각의 예제로 내 대답을 편집했습니다 – mhlester

+0

패킹에 서명이 없다면 예외가 발생했을 것입니다 : struct.error : 'H'format code ' – mhlester

0

2의 보수 연산 및 일부 문자열 슬라이스 : 당신이 (즉, 2의 보수를하지 않음) 제대로 음이 아닌 숫자를 처리하는데주의를 기울여야 할 것이다

hex(200 - (1 << 16)) #2 bytes -> 16 bits 
Out[26]: '-0xff38' 

int(hex(200 - (1 << 16))[-4:-2], 16) 
Out[28]: 255 

int(hex(200 - (1 << 16))[-2:], 16) 
Out[29]: 56 

주와의 길이 hex에 의해 반환 된 문자열의 길이는 다양합니다.