我通过以太网传输以下数据
unsigned int test_value[ROW][COLUMN] = {
{0x00, 0x00, 0x00, 0x01} ,
{0x40, 0x00, 0x00, 0x01} , /* initializers for row indexed by 0 */
{0x80, 0x01, 0x81, 0x20} , /* initializers for row indexed by 1 */
{0x82, 0x52, 0x83, 0xff} /* initializers for row indexed by 2 */
};
接收时我使用iso-8859-1解码来解码数据。 代码:
import socket
import os
import sys
import binascii
import codecs
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("147.83.49.195", 7))
listening = True
f=open("eth.bin","w+")
f1=open("eth.txt","w+")
data1=[]
while listening:
data = sock.recv(65536).decode('iso-8859-1')
#data=binascii.unhexlify(data)
#for d in data:
#d=data.decode('cp1254')
if data:
print(data)
#print(addr)
#data1.append(data)
f=open("eth.bin","a+")
f.write(str(data))
f1=open("eth.txt","a+")
f1.write(str(data))
else:
listening=False
#print(data1)
sock.close()
当我查看接收到的数据时,每个大于0x7f的数据都被接收为两个8位数据。即,如果我传输0xff,它将被收到\xc3 \xbf
。
有没有办法同时将0xff
解析为\xff
,又将0x00
解码为\x00
?
我应该使用任何其他解码技术吗?
我通过运行以下代码查看终端中收到的数据:
fo=open("eth.bin","rb")
#f1=open("data.txt","w+")
data=fo.read()
print(data)
text= ' '.join('{:02x}'.format(b) for b in data)
print(text)
.bin文件的内容:
\00\00\00@\00\00 Rÿ
得出以下结果:
Received data in the terminal:
b'\x00\x00\x00\x01@\x00\x00\x01\xc2\x80\x01\xc2\x81 \xc2\x82R\xc2\x83\xc3\xbf'
00 00 00 01 40 00 00 01 c2 80 01 c2 81 20 c2 82 52 c2 83 c3 bf
寻找任何建议。
答案 0 :(得分:1)
@TobySpeight是正确的,你是decode('iso-8859-1')
- 将接收到的二进制数据从套接字转换为Python字符串。您的二进制0xFF
字符解码为字符串字符ÿ
。然后,您将这些字符串写入文本模式文件。 Python对文本模式文件隐式使用UTF-8。字符ÿ
以UTF-8表示为2字节序列[0xc3,0xbf],这是您在查看文件末尾时看到的内容。
听起来你实际上并不想解码套接字上收到的数据,或者你想将它重新编码为' iso-8859-1'写文件的时候?
在第一种情况下:
f = open("eth.bin","ab+")
f.write(data.encode("iso-8859-1"))
会将解码后的字符串数据重新转换回二进制文件,以便写入二进制文件。或者你仍然可以在文本模式下打开文件并告诉python使用" iso-8859-1"而不是默认/隐式UTF-8编码:
f = open("eth.bin", "a+", encoding="iso-8859-1")
f.write(data)