iso-8859-1 unicode转换异常

时间:2018-04-23 14:13:45

标签: python python-3.x character-encoding

我通过以太网传输以下数据

 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

寻找任何建议。

1 个答案:

答案 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)