Lua, traitement de la non-ascii octet ruisseaux, byteorder changement
Besoin d'encoder & décoder octet-stream (contenant des caractères non-ascii peut-être), à partir de/dans uint16, uint32, uint64 (typique C/C++ sens), en prenant soin de l'endianness. Ce qui est efficace & j'espère que la croix-plate-forme de façon à faire une telle chose en Lua ?
Ma cible arch 64 bits x86_64, mais souhaitez garder portable (si cela ne coûte pas moi sur la performance à l'avant).
par exemple
décoder (disons actuellement en Lua string) --
0x00, 0x1d, 0xff, 0x23, 0x44, 0x32 (little endian)
as -
uint16: (0x1d00) = 7424
uint32: (0x324423ff) = 843326463
Serait génial si quelqu'un peut expliquer avec un exemple.
OriginalL'auteur mike.dinnone | 2011-03-09
Vous devez vous connecter pour publier un commentaire.
Prendre un coup d'oeil à la struct et lpack bibliothèques.
Dans cet exemple, j'utilise le
struct.unpack
pour décoder un Lua chaîne en deux entiers forcé little-endian encodage:essayé le code après la fixation de luarocks et l'installation de 'struct' mais pour lua crèches à propos de second paramètre pour décompresser (c'est à dire str) n'étant pas de la chaîne. pour déboguer j'ai essayé ce petit code (qui n'a pas de lit, mais ne semble pas fonctionner comme prévu --
> str = string.char(0x00, 0xff)
> local u16 = struct.unpack('<I2', str)
> print(u16)
nil
désolé! il fixe. léger changement était nécessaire en Lua 5.1 (au moins sur mon système). juste eu à faire un:
struct = require("struct")
Étrange, j'ai testé le code présenté dans Lua 5.1, et il a fonctionné correctement (j'avais peut-être une version plus ancienne de
struct
), mais je suis content que cela fonctionne pour vous maintenant, c'est un outil très pratique pour des données binaires...OriginalL'auteur Michal Kottman
pour la conversion d'octets pour les int (en prenant soin de l'endianness au niveau octet, et ce paramètre):
Et pendant que nous y sommes aussi dans une autre direction:
Toutes les remarques sont les bienvenues, il est testé, mais pas trop bien...
En fonction bytes_to_int, la ligne n = (n > 2^(#t-1) -1) et (n - 2^#t) ou n je pense qu'Il devrait être #t*8 ou #t. Est le nombre de bits que vous voulez, pas d'octets.
Il semble que vous êtes de droite! Merci pour la suggestion, j'ai corrigé ça dans ma réponse.
merci beaucoup. Fonction int_to_bytes aussi besoin de correction lorsque vous traitez avec des nombres signés: si elle est signée et num < 0, alors, à côté de la ligne de 2^n doit être num = num + 2^(8 * n)
int_to_bytes n'est pas toujours de la manipulation des nombres signés correctement (quand exp de frexp est multiple de 8). Par exemple, -32769 doit être 0xFF 0xFF 0x80, 0x00, mais la fonction qu'il est retourne 0x7F 0xFF.
OriginalL'auteur jpjacobs
ma suggestion pour un "Int16ToByte"-fonction sans vérification des paramètres:
OriginalL'auteur bane2