2014-07-14 3 views
1

나는 이것에 간단한 대답이있을 것이라고 확신한다. 문제는 내가 할 수있는 대답을 얻으려면 google에서 정확하게 표현하는 것이다. 소켓에서 원시 패킷을 가져 오는 중입니다.소켓에서 파이썬 16 진수가 ascii로 변환

pkt=sock.recv(2048) 
'\x00\x00\x12\x00.H\x00\x00\x00\x02l\t\xa0\x00\xb3\x01\x00\x00' 

위는 바이트의 몇 가지가 즉 ASCII로 변환 한 당신이 볼 수 있듯이 radiotap이다 '.', 'H', 't'. 나는 16 진수 값을 얻을 수 있습니다 어떻게 읽을 수 있도록 :

'\x00\x00\x12\x00\x2e\x48 ...' 
+1

바이트가 실제로 ASCII로 변환되지 않았다고 생각합니다. 인쇄 루틴은 인쇄 가능한 바이트 값을 ASCII 문자로 표시합니다. –

+0

나는 그렇게 생각하지 않는다. 그러나 나는 그것이 화면에서 그런 식으로 출력되는 것을보고 싶다. – WraithWireless

답변

2

RECV는() 문자열이 같은 것을 할 수 반환 이후 :

pkt=sock.recv(2048) 
# pkt = "1234567890" # uncomment to test 

for i in pkt: 
    print hex(ord(i)) 
1

내가 일반적으로 다음과 같은 표시 문자열 같은 것을 사용합니다 육각 형태 :

>>> def tohexstr(s): 
...  return ''.join('%02x' % ord(c) for c in s) 
... 
>>> tohexstr('1 2 3 a b c') 
'3120322033206120622063' 

이 많이하고 있다면, 당신은 __repr__ 방법을 str를 서브 클래스 화해, 오버라이드 (override)하는 것 같아서 :

다른 바이트 구분와 주변
>>> class hexstr(str): 
...  def __repr__(self): 
...   return ''.join('%02x' % ord(c) for c in self) 
... 
>>> hexstr('\x01\x02\x03\x30\x31abc') 
0102033031616263 

재생 예를 들어, 당신을 위해 일하는 것을 볼 수 있습니다 : 당신이 여기에서 보는 것은 단지 읽을 수있는 문자열 표현입니다

>>> s = 'abc123' 
>>> print ''.join('\\x%02x' % ord(c) for c in s) 
\x61\x62\x63\x31\x32\x33 
>>> print '-'.join('%02x' % ord(c) for c in s) 
61-62-63-31-32-33 
2

. 사실 \x00은 1 바이트, 즉 널 바이트입니다. H도 1 바이트이며 값은 0x48입니다 (이미 작성한 것처럼).

해당 문자열을 즉시 인쇄하면 인쇄 가능한 문자 만 표시됩니다. 체 제어 문자가 실행됩니다.

당신은 전체 가치 진수 표현을 원하는 경우에, 당신은

print pkt.encode('hex') # at least under Py2 
print " ".join("%02x" % ord(i) for i in pkt) 
print "\x" + "\x".join("%02x" % ord(i) for i in pkt) 
0

작업을 수행 할 수 있습니다 나는 그 당신이 점점 숫자 생각합니다. 참고 :

In [24]: aaa = '\x00\x00\x12\x00\x2E\x48\x00\x02' 

In [25]: aaa 
Out[25]: '\x00\x00\x12\x00.H\x00\x02'