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?

Foi útil?

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

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top