Python 双编码
Python Dual Encoding
我有一段代码可以转换为 cp1252
问题是,似乎 1252 不支持所有字符,除非我以某种方式做错了我将代码发送到一个盒子接收它并转换它..如果支持字符但有时它会工作但如果它们是如果有人知道有什么问题,那将不会因为一些奇怪的原因而转换它。
def ByteToHex( byteStr ):
return ' '.join( [ "%02X" % ord( x ) for x in byteStr ] )
def HexToByte( hexStr ):
bytes = []
hexStr = ''.join( hexStr.split(" ") )
for i in range(0, len(hexStr), 2):
bytes.append( chr( int (hexStr[i:i+2], 16 ) ) )
return ''.join( bytes ).encode(encoding='cp1252', errors='strict')
def sockCon ():
global HOST
global PORT
global TX
TX = b"\x7E\x00\x0C\x01\x00\xA5\xBD\x00\x7E\x01\x00\x40\x2D\x00\x3F\x71"
T_X = 'TX = '
R_X = 'RX = '
BUFFER = 8192
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
b = 1
while b == 1:
s.send(TX)
time.sleep(1)
__ByteStr2 = s.recv(BUFFER)
print (__ByteStr2)
xxString = __ByteStr2[16:-2].decode('cp1252')
__bytStr = ByteToHex(xxString)
print (__bytStr)
listStr = "".join(__bytStr)
print (listStr)
print ("Something is ", struct.unpack('!d', HexToByte(listStr)))
所以在代码运行后我会得到这样的东西...
如果代码有效并且字符受支持,那么它看起来像这样..
b'~\x00\x16\x81\xa5\xbd3\x02~\x00\x01\xc7-\n\x00\x11@ivfffff\x90\xac'
40 69 76 66 66 66 66 66
40 69 76 66 66 66 66 66
Something is (203.7,)
然而,如果字符不受支持,那么它看起来像这样。
b'~\x00\x16\x81\xa5\xbd4\x02~\x00\x01\xc7-\n\x00#@\r\x99\x99\x99\x99\x99\x9aa\x01'
40 0D 2122 2122 2122 2122 2122 161
40 0D 2122 2122 2122 2122 2122 161
Traceback (most recent call last):
File "C:\Users\ecunningham\Desktop\Python Projects\Test\main\hello.py", line 78, in <module>
sockCon()
File "C:\Users\ecunningham\Desktop\Python Projects\Test\main\hello.py", line 76, in sockCon
print ("The Display Value is", struct.unpack('!d', HexToByte(listStr)))
struct.error: unpack requires a bytes object of length 8
Nvm 伙计们,我解决了我的问题,似乎 cp1252 在其解码中具有 Unicode 字符 table,我所要做的就是删除它们并将十六进制值从 \x80 一直向上放置 9F
我有一段代码可以转换为 cp1252
问题是,似乎 1252 不支持所有字符,除非我以某种方式做错了我将代码发送到一个盒子接收它并转换它..如果支持字符但有时它会工作但如果它们是如果有人知道有什么问题,那将不会因为一些奇怪的原因而转换它。
def ByteToHex( byteStr ):
return ' '.join( [ "%02X" % ord( x ) for x in byteStr ] )
def HexToByte( hexStr ):
bytes = []
hexStr = ''.join( hexStr.split(" ") )
for i in range(0, len(hexStr), 2):
bytes.append( chr( int (hexStr[i:i+2], 16 ) ) )
return ''.join( bytes ).encode(encoding='cp1252', errors='strict')
def sockCon ():
global HOST
global PORT
global TX
TX = b"\x7E\x00\x0C\x01\x00\xA5\xBD\x00\x7E\x01\x00\x40\x2D\x00\x3F\x71"
T_X = 'TX = '
R_X = 'RX = '
BUFFER = 8192
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
b = 1
while b == 1:
s.send(TX)
time.sleep(1)
__ByteStr2 = s.recv(BUFFER)
print (__ByteStr2)
xxString = __ByteStr2[16:-2].decode('cp1252')
__bytStr = ByteToHex(xxString)
print (__bytStr)
listStr = "".join(__bytStr)
print (listStr)
print ("Something is ", struct.unpack('!d', HexToByte(listStr)))
所以在代码运行后我会得到这样的东西...
如果代码有效并且字符受支持,那么它看起来像这样..
b'~\x00\x16\x81\xa5\xbd3\x02~\x00\x01\xc7-\n\x00\x11@ivfffff\x90\xac'
40 69 76 66 66 66 66 66
40 69 76 66 66 66 66 66
Something is (203.7,)
然而,如果字符不受支持,那么它看起来像这样。
b'~\x00\x16\x81\xa5\xbd4\x02~\x00\x01\xc7-\n\x00#@\r\x99\x99\x99\x99\x99\x9aa\x01'
40 0D 2122 2122 2122 2122 2122 161
40 0D 2122 2122 2122 2122 2122 161
Traceback (most recent call last):
File "C:\Users\ecunningham\Desktop\Python Projects\Test\main\hello.py", line 78, in <module>
sockCon()
File "C:\Users\ecunningham\Desktop\Python Projects\Test\main\hello.py", line 76, in sockCon
print ("The Display Value is", struct.unpack('!d', HexToByte(listStr)))
struct.error: unpack requires a bytes object of length 8
Nvm 伙计们,我解决了我的问题,似乎 cp1252 在其解码中具有 Unicode 字符 table,我所要做的就是删除它们并将十六进制值从 \x80 一直向上放置 9F