我通过以太网传输以下数据
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位数据。也就是说,如果我发送0 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寻找任何建议。
发布于 2018-04-23 15:36:32
@TobySpeight是正确的,您是decode('iso-8859-1')-ing接收到的从套接字到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)https://stackoverflow.com/questions/49983346
复制相似问题