Hex dados de soquete, processo e resposta
Pergunta
Vamos colocá-lo em partes.
Eu tenho uma tomada de recepção de dados OK e eu tenho-o no formato \x31\x31\x31
.
Eu sei que posso obter o mesmo número, rasgando o \x
com algo como
for i in data: print hex(ord(i))
então eu tenho 31
em cada caso.
Mas se eu quiser adicionar 1 para os dados (assim será "32 32 32
") para enviá-lo como resposta, como posso obtê-lo em \x32\x32\x32
novamente?
Solução
O "\ x31" não é um formato, mas a representação de texto dos dados binários. Como você menciona ord () irá converter um byte de dados binários em um int, então você pode fazer a matemática sobre ele.
Para convertê-lo de volta para dados binários em uma string, você pode usar chr () se é em apenas um número inteiro. Se é muitos, você pode usar o% c formatação de caracteres de uma string:
>>> "Return value: %c%c%c" % (5,6,7)
'Return value: \x05\x06\x07'
No entanto, a melhor maneira é provavelmente para uso struct.
>>> import struct
>>> foo, bar, kaka = struct.unpack("BBB", '\x06\x06\x06')
>>> struct.pack("BBB", foo, bar+1, kaka+5)
'\x06\x07\x0b'
Você pode até querer dar uma olhada em ctypes.
Outras dicas
usar o módulo struct
descompactar e obter os valores 3 em abc
(a, b, c) = struct.unpack(">BBB", your_string)
então
a, b, c = a+1, b+1, c+1
e embalar na resposta ??p>
response = struct.pack(">BBB", a, b, c)
veja o módulo struct na documentação python para mais detalhes
O oposto de ord () seria chr ().
Então, você poderia fazer isso para adicionar um a ele:
newchar = chr(ord(i) + 1)
Para usar isso em seu exemplo:
newdata = ''
for i in data:
newdata += chr(ord(i) + 1)
print repr(newdata)
Mas se você realmente queria trabalhar em strings hexadecimais, você pode usar codificar () e decodificação ():
>>> 'test string'.encode('hex')
'7465737420737472696e67'
>>> '7465737420737472696e67'.decode('hex')
'test string'
OMG, o que é uma resposta rápida! : D
Eu acho que eu estava preso no parâmetro "> B" para struct, como eu usei "h" e que os parâmetros de amostragem (novato em falar struct.pack!)
Tentou a coisa codificação / decodificação, mas tomada do outro lado recebê-los como números, não o "\ x" representação que queria.
Eu realmente gosto da simplicidade do formato% c, e vai usar isso como coisa temporal (eu não processo de tantos dados para que não tem razão de ser ultraefficient atm: D). Ou a coisa struct depois de jogar com ele um pouco
E no exemplo, jogar apenas com um caractere de cada vez, encontrar struct trabalhando muito, SINA "> B" só hehe.
Obrigado a todos.