como converter dados de um arquivo binário em valores decimais

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

como converter dados de um arquivo binário em valores decimais

jose
Pessoal,
Primeiramente, desculpe-me a dúvida de iniciante...
Gostaria de saber como converter uma informação de um arquivo binário para um valor decimal. O código abaixo lê um arquivo binário em grupos de 4 bytes e escreve cada byte em seu valor hexadecimal. Tenta também escrever o valor de cada grupo de 4 bytes em seu valor decimal (grupos do tipo "unsigned integer"). No entanto, ele não faz esse último passo corretamente, o que pode ser visto logo abaixo do código para os primeiros grupos de bytes. Alguém pode me dizer o que está errado? Obrigado!
    
    arg = "C:/binario.ts0"
    local f = assert(io.open(arg, "rb"))
    local block = 4
    while true do
      local bytes = f:read(block)
      if not bytes then break end
      for b in string.gfind(bytes, ".") do
         io.write(string.format("%02X ", string.byte(b)))
      end
      io.write(string.rep("   ", block - string.len(bytes) + 1))
      io.write(string.gsub(bytes, "%c", "%u"), "\n")
    end

> 35 2E 30 31    5.01
> 5F 30 31 2D    _01-
> 4E 4F 56 2D    NOV-
> 30 34 00 4C    04uL
> B9 0B 00 00    ¹uuu
> 66 00 00 00    fuuu

--
Lua BR - http://groups.google.com/group/lua-br
Reply | Threaded
Open this post in threaded view
|

Re: como converter dados de um arquivo binário em valores decimais

Gabriel Lucas
sou novato e ñ entendi nada desse codigo acima

--
Lua BR - http://groups.google.com/group/lua-br
Reply | Threaded
Open this post in threaded view
|

Re: como converter dados de um arquivo binário em valores decimais

Fidelis Assis
In reply to this post by jose
Em 21 de setembro de 2012 11:31, jose <[hidden email]> escreveu:

>     arg = "C:/binario.ts0"

Só um lembrete: arg é o nome de uma tabela global, criada
automaticamente pelo interpretador, contendo todos os argumentos da
linha de comando. Você pode, mas não é interessante usar esse nome de
variável para outras coisas

>       io.write(string.gsub(bytes, "%c", "%u"), "\n")

"%c" e "%u" aqui não significam especificação de formato, mas padrão
de busca para o primeiro e nada no segundo. Veja string.gsub e
Patterns no manual. "%c" no segundo argumento significa caracteres de
controle e "%u" no terceiro argumento não é definido em Lua 5.1 nem em
Lua 5.2. Em Lua 5.2 dá erro, coerente com o manual. Em Lua 5.1 se
comporta como um escape comum (por acaso), valendo a própria letra "u"
no seu exemplo. Isso indica que você usou Lua 5.1, que trocou os
caracteres de controle pela letra "u".

>> B9 0B 00 00    ¹uuu

0B, 00  => u

Para o que você quer, tente lpack ou struct:
- http://www.tecgraf.puc-rio.br/~lhf/ftp/lua/#lpack
- http://www.inf.puc-rio.br/~roberto/struct/.

--
Fidelis Assis

--
Lua BR - http://groups.google.com/group/lua-br