php algoritmo - ¿Cómo puedo descomprimir datos con formato hexadecimal binario en Python?





para convertir (4)


En Python usa el módulo struct para esto.

>>> from struct import *
>>> pack('hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)
>>> calcsize('hhl')
8

HTH

Usando la función PHP pack () , he convertido una cadena en una representación hexagonal binaria:

$string = md5(time); // 32 character length
$packed = pack('H*', $string);

El formato H * significa "Cadena hexagonal, primer mordisco alto primero".

Para descomprimir esto en PHP, simplemente usaría la función unpack () con el indicador de formato H *.

¿Cómo descomprimiría esta información en Python?




Hay una manera fácil de hacer esto con el módulo binascii :

>>> import binascii
>>> print binascii.hexlify("ABCZ")
'4142435a'

A menos que esté malinterpretando algo sobre el orden de mordisquear (el mordisco alto es el predeterminado), ¡eso debería ser perfectamente suficiente!

Además, los objetos hashlib.md5 de Python tienen un método hexdigest() para convertir automáticamente el resumen MD5 a una cadena hexadecimal ASCII, de modo que este método ni siquiera es necesario para los resúmenes MD5. Espero que ayude.




No hay un código correspondiente de "nibble hexadecimal" para struct.pack, por lo que tendrá que empacar manualmente en bytes primero, como por ejemplo:

hex_string = 'abcdef12'

hexdigits = [int(x, 16) for x in hex_string]
data = ''.join(struct.pack('B', (high <<4) + low) 
               for high, low in zip(hexdigits[::2], hexdigits[1::2]))

O mejor, puedes usar el códec hexadecimal. es decir.

>>> data = hex_string.decode('hex')
>>> data
'\xab\xcd\xef\x12'

Para desempaquetar, puede codificar el resultado de nuevo para hexagonal de manera similar

>>> data.encode('hex')
'abcdef12'

Sin embargo, tenga en cuenta que, para su ejemplo, probablemente no haya necesidad de realizar el viaje de ida y vuelta a través de una representación hexadecimal cuando se codifica. Solo usa el resumen binario md5 directamente. es decir.

>>> x = md5.md5('some string')
>>> x.digest()
'Z\xc7I\xfb\xee\xc96\x07\xfc(\xd6f\xbe\x85\xe7:'

Esto es equivalente a su presentación pack () ed. Para obtener la representación hexadecimal, use el mismo método de desempaquetado anterior:

>>> x.digest().decode('hex')
'acbd18db4cc2f85cedef654fccc4a4d8'
>>> x.hexdigest()
'acbd18db4cc2f85cedef654fccc4a4d8'

[Editar]: actualizado para usar un método mejor (códec hexadecimal)




Fecha: 2017-12-04

Todas las soluciones posibles han sido enumeradas en otras respuestas.

Una forma intuitiva y discutible de verificar si un archivo existe es la siguiente:

import os
os.path.isfile('~/file.md')    # Returns True if exists, else False
additionaly check a dir
os.path.isdir('~/folder') # Returns True if the folder exists, else False
check either a dir or a file
os.path.exists('~/file')

Hice una hoja de trucos exhaustiva para su referencia:

#os.path methods in exhaustive cheatsheet
{'definition': ['dirname',
               'basename',
               'abspath',
               'relpath',
               'commonpath',
               'normpath',
               'realpath'],
'operation': ['split', 'splitdrive', 'splitext',
               'join', 'normcase'],
'compare': ['samefile', 'sameopenfile', 'samestat'],
'condition': ['isdir',
              'isfile',
              'exists',
              'lexists'
              'islink',
              'isabs',
              'ismount',],
 'expand': ['expanduser',
            'expandvars'],
 'stat': ['getatime', 'getctime', 'getmtime',
          'getsize']}






php python binary hex