2012-02-04 25 views
6

Tengo varios valores hexadecimales que intento escribir en un archivo. Parece que Lua no lo admite de inmediato, ya que todos son tratados como cadenas en lugar de valores. Pensé que tendría que dividir un valor hexadecimal más largo, por ejemplo AABBCC en AA, BB, CC y usar string.char() en todos sus valores decimales consecutivamente para hacer el trabajo.Lua: escribir valores hexadecimales como un archivo binario

¿Existe una función incorporada que me permita escribir dichos valores directamente sin convertirlos primero? Usé caracteres de escape como "0xAA" y "\ xAA", pero no funcionó.

Editar: Déjame darte un ejemplo. Estoy buscando a un archivo de prueba en un editor hexadecimal:

00000000 00 00 00 00 00 00 ...... 

Y quiero escribir en él de la siguiente manera con el "AABBCC" cadena:

00000000 AA BB CC 00 00 00 ...... 

Lo que obtengo aunque con los caracteres de escape es:

00000000 41 41 42 42 43 43 AABBCC 

Respuesta

23

que utilizar las siguientes funciones para convertir entre una cadena hexadecimal y un "binario":

function string.fromhex(str) 
    return (str:gsub('..', function (cc) 
     return string.char(tonumber(cc, 16)) 
    end)) 
end 

function string.tohex(str) 
    return (str:gsub('.', function (c) 
     return string.format('%02X', string.byte(c)) 
    end)) 
end 

Pueden ser utilizados de la siguiente manera:

("Hello world!"):tohex()    --> 48656C6C6F20776F726C6421 
("48656C6C6F20776F726C6421"):fromhex() --> Hello world! 
+0

¡Perfecto! Justo lo que estaba buscando. ¡Muchas gracias! – Zerobinary99

+0

Esta solución parece agregar el valor hexadecimal 0c0D (o 13) a algunos lugares aparentemente aleatorios. Estaba tan cerca de lo que necesitaba. –

+1

Bueno, ¿estás escribiendo esto en Windows? Si es así, entonces el problema está en [saltos de línea] (http://en.wikipedia.org/wiki/Line_break_ (computing)). Mientras que en Unix/Linux/Mac OS X, la nueva línea está representada por el único '\ n' = 0x0A, en Windows cuando escribe una nueva línea, incorpora dos bytes: 0x0D, 0x0A (13 10, CR + LF).Esta puede ser la razón por la que estás viendo 0x0D en lugares aleatorios. Intente ver si está cerca de 0x0A; si este es el caso, use herramientas de conversión para convertir a estilo Unix (solo '\ n'). –

2

Así que tiene una cadena como esta:

value = 'AABBCC' 

Y desea imprimirlo (o convertirlo en una cadena) como este?

'101010101011101111001100' 

¿Qué le parece esto?

function hex2bin(str) 
    local map = { 
     ['0'] = '0000' 
     ['1'] = '0001' 
     ['2'] = '0010' 
     -- etc. up to 'F' 
    } 
    return str:gsub('[0-9A-F]', map) 
end 

Tenga en cuenta que no deja ningún rasgo que no pueda interpretarse como hexadecimal.

+0

No, yo no quiero convierta los datos hexadecimales, pero quiero escribir una cadena hexadecimal como un valor hexadecimal en lugar de una cadena. Permítanme mejorar mi pregunta anterior. – Zerobinary99

2

Existe tal función porque es así de fácil de escribir.

function writeHex(str,fh) 
    for byte in str:gmatch'%x%x' do 
     fh:write(string.char(tonumber(byte,16))) 
    end 
end 

Esto sencillamente esto escribe los valores en el fichero apuntado por el gestor de archivo FH.

+0

No funciona para los valores hexadecimales que se almacenan como cadenas. ¿Qué formato necesita "str" ​​para que esto funcione correctamente? – Zerobinary99

+0

Bueno, sí, tienes razón, cometí un error en el código. Arreglado. – jpjacobs

+0

Creo que te refieres a 'str: gmatch '% x% x'' ya que'% X' es la negación de lo que estás buscando. – greatwolf

Cuestiones relacionadas