首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iso-8859-1 unicode转换异常

iso-8859-1 unicode转换异常
EN

Stack Overflow用户
提问于 2018-04-23 14:13:45
回答 1查看 205关注 0票数 0

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

代码语言:javascript
复制
 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解码来解码数据。代码:

代码语言:javascript
复制
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?我应该使用其他的解码技术吗?我通过运行以下代码查看终端中接收到的数据:

代码语言:javascript
复制
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文件的内容:

代码语言:javascript
复制
\00\00\00@\00\00 Rÿ

其结果如下:

代码语言:javascript
复制
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

寻找任何建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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”吗?

在第一种情况下:

代码语言:javascript
复制
f = open("eth.bin","ab+")
f.write(data.encode("iso-8859-1"))

将解码后的字符串数据重新转换为二进制数据,以便写入二进制文件。或者,您仍然可以以文本模式打开文件,并告诉python使用"iso-8859-1“,而不是默认/隐式UTF-8编码:

代码语言:javascript
复制
f = open("eth.bin", "a+", encoding="iso-8859-1")
f.write(data)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49983346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档