Чтение двоичного файла в массив - PullRequest
2 голосов
/ 23 ноября 2010

У меня есть файл, состоящий из серии 32-разрядных целочисленных значений со знаком (little-endian). Как я могу прочитать это в массив (или аналогичную) структуру данных?

Я пробовал это:

block = 4
while true do
  local int = image:read(block)
  if not int then break end
  memory[i] = int
  i = i + 1
end

Но таблица памяти не содержит значений, которые соответствуют значениям в файле. Любые предложения будут оценены.

Ответы [ 3 ]

8 голосов
/ 24 ноября 2010

Этот небольшой пример будет читать 32-битное целое число со знаком из файла и печатать его значение.

    -- convert bytes (little endian) to a 32-bit two's complement integer
    function bytes_to_int(b1, b2, b3, b4)
      if not b4 then error("need four bytes to convert to int",2) end
      local n = b1 + b2*256 + b3*65536 + b4*16777216
      n = (n > 2147483647) and (n - 4294967296) or n
      return n
    end

    local f=io.open("test.bin") -- contains 01:02:03:04
    if f then
        local x = bytes_to_int(f:read(4):byte(1,4))
        print(x) --> 67305985
    end
3 голосов
/ 23 ноября 2010

Я бы рекомендовал десериализовать данные, используя lpack .

0 голосов
/ 23 ноября 2010

Вам нужно будет преобразовать строки, которые предоставляет image: read (), в нужное вам число.

...