Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python十六进制从套接字转换为ascii_Python_Sockets - Fatal编程技术网

Python十六进制从套接字转换为ascii

Python十六进制从套接字转换为ascii,python,sockets,Python,Sockets,我相信这有一个简单的答案,问题是在谷歌中正确地表达它,以得到我似乎能做到的答案。我从插座上收到一个原始数据包 pkt=sock.recv(2048) '\x00\x00\x12\x00.H\x00\x00\x00\x02l\t\xa0\x00\xb3\x01\x00\x00' 如您所见,上面是radiotap,其中几个字节被转换为ascii,即“.”、“H”、“t”。如何获取十六进制值,使其显示: '\x00\x00\x12\x00\x2e\x48 ...' 由于recv()返回一个字符串,

我相信这有一个简单的答案,问题是在谷歌中正确地表达它,以得到我似乎能做到的答案。我从插座上收到一个原始数据包

pkt=sock.recv(2048)
'\x00\x00\x12\x00.H\x00\x00\x00\x02l\t\xa0\x00\xb3\x01\x00\x00'
如您所见,上面是radiotap,其中几个字节被转换为ascii,即“.”、“H”、“t”。如何获取十六进制值,使其显示:

'\x00\x00\x12\x00\x2e\x48 ...'
由于recv()返回一个字符串,因此可以执行以下操作:

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

for i in pkt:
    print hex(ord(i))
由于recv()返回一个字符串,因此可以执行以下操作:

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

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

在以十六进制形式显示字符串时,我通常会使用以下内容:

>>> def tohexstr(s):
...     return ''.join('%02x' % ord(c) for c in s)
...
>>> tohexstr('1 2 3 a b c')
'3120322033206120622063'
如果您经常这样做,您可能希望子类化
str
,并重写
\uuuu repr\uuu
方法:

>>> 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

在以十六进制形式显示字符串时,我通常会使用以下内容:

>>> def tohexstr(s):
...     return ''.join('%02x' % ord(c) for c in s)
...
>>> tohexstr('1 2 3 a b c')
'3120322033206120622063'
如果您经常这样做,您可能希望子类化
str
,并重写
\uuuu repr\uuu
方法:

>>> 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

您在这里看到的只是一个可读的字符串表示。实际上,
\x00
是一个字节,即空字节
H
也是一个字节,其值为0x48(如您所写)

如果您立即打印该字符串,您将只看到可打印的字符;将执行che控制字符

如果您想要一个全值十六进制表示,您可能需要这样做

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)

您在这里看到的只是一个可读的字符串表示。实际上,
\x00
是一个字节,即空字节
H
也是一个字节,其值为0x48(如您所写)

如果您立即打印该字符串,您将只看到可打印的字符;将执行che控制字符

如果您想要一个全值十六进制表示,您可能需要这样做

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)

我想这些就是你得到的数字。注:

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

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

我想这些就是你得到的数字。注:

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

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

我不认为字节实际上被转换成了ASCII;相反,打印例程将可打印的字节值显示为ascii字符。我也不这么认为,但我希望看到它在屏幕上以这种方式打印出来。我不认为字节实际上已转换为ascii;相反,打印例程将可打印字节值显示为ascii字符。我也不这么认为,但我希望看到它以这种方式在屏幕上打印出来