2015-07-02 4 views
0

У меня есть данные, которые я хотел бы декодировать, и его в Windows-1252 в основном я отправляю код в сокет, и он отправляет его обратно, и я должен декодировать сообщение и использовать IEEE-754 для получения определенного но я могу представить, как это все кодировать. Вот мой код.Проблемы с кодировкой Python

def printKinds(): 
    test = "x40\x39\x19\x99\x99\x99\x99\x9A" 

    print (byt1Hex(test)) 
    test = byt1Hex(test).replace(' ', '') 
    struct.unpack('<d', binascii.unhexlify(test)) 
    print (test) 
printKinds() 

def byt1Hex(bytStr): 
    return ' '.join([ "%02X" % ord(x) for x in bytStr ]) 

Поэтому я использую это, а затем я должен получить значение от этого. Но он не работает, и я не могу понять, почему.

Ток на выходе я получаю

struct.unpack('<d', binascii.unhexlify(data)) 
struct.error: unpack requires a bytes object of length 8 

Это ошибка ожидаемый выход я ищу это 25,1 , но когда я кодировать его, он фактически изменяет строку в неправильные значения так, когда Я делаю это:

print (byt1Hex(data)) 

Я надеюсь получить это.

40 39 19 99 99 99 99 9A 

Но я на самом деле получить это вместо

78 34 30 39 19 99 99 99 99 9A 
+0

Предоставьте код, который мы действительно можем запустить. Покажите нам функцию byt1Hex. –

+0

Что не работает? Что ожидается выход? Каков фактический результат? Что делает 'byt1Hex'? –

+0

Недостаточно смысла интерпретировать текст cp1252 как двоичное значение IEEE-754: 'struct.unpack ('! D', 'abcdefgh'.encode (' cp1252 '))' – jfs

ответ

3
>>> import struct 
>>> struct.pack('!d', 25.1) 
b'@9\x19\x99\x99\x99\x99\x9a' 
>>> struct.unpack('!d', _) #NOTE: no need to call byt1hex, unhexlify 
(25.1,) 

Вы отправляете, получаете байты по сети. Нет необходимости в hexlify/unhexlify их; если протокол не требует этого (тогда вы должны указать протокол в вопросе).

+0

Но я получаю данные «\ x40 \ x39 \ x19 \ x99 \ x99 \ x99 \ x99 \ x9A" с хоста, и похоже, вы изменили его? – cunniemm

+0

@BSD_: это то же самое: 'b" @ "== b" \ x40 "' (если вы находитесь на Python 2, то вы не увидите префикс 'b' для байтовых литералов) – jfs

+0

Awesome Спасибо – cunniemm

0

У вас есть:

test = "x40\x39\x19\x99\x99\x99\x99\x9A" 

Понадобится:

test = "\x40\x39\x19\x99\x99\x99\x99\x9A" 
Смежные вопросы