2016-10-04 2 views
1

J'ai un protocole qui nécessite la conversion de données binaires vers et à partir d'une chaîne hexadécimée où les faibles-quartets (4 bits inférieurs de chaque octet) viennent en premier - ainsi par exemple la chaîne Python '\ xab \ xcd' serait encodée en 'badc'. Ce format impair provient des fonctions PHP/Perl pack et unpack au format h* (voir http://php.net/manual/en/function.pack.php).Binaire à hexadécimal en Python, premier encodage faible

Évidemment, il est évident que binascii.hexlify() et al n'y arriveront pas. J'ai essayé d'utiliser différents formats avec le module struct ainsi que array byteswapping as suggested here mais je n'ai pas réussi à le faire fonctionner.

Je fini par résoudre avec un peu vieillot peu de jongler comme ceci:

def to_low_nibble_hex(value): 
    """Convert a binary string to hex using low-nibble first encoding 
    """ 
    r = [] 
    for c in value: 
     c = ord(c) 
     hb = (0x0f & c) << 4 
     lb = (0xf0 & c) >> 4 
     nc = chr(hb | lb) 
     r += [nc] 
    return binascii.hexlify(''.join(r)) 

Cela semble bien fonctionner dans mon cas, mais je me demandais si quelqu'un peut suggérer une approche plus formelle.

Répondre

0

Une façon plus efficace serait de précalculer une table de traduction, puis il suffit d'appliquer à l'aide str.translate()

_translation = bytearray(((0x0f & c) << 4 | (0xf0 & c) >> 4) 
         for c in range(256)) 

def to_low_nibble_hex(value): 
    return binascii.hexlify(value.translate(_translation)) 

Cela fonctionne également sur python3 sans modification, bien que vous pouvez remplacer bytearray avec bytes

+0

En effet, cela semble propre et efficace, et je vais probablement l'adopter, alors merci! Cependant, je me demande toujours s'il existe une solution plus standard. – shevron