2013-12-04 4 views
2

Я хочу прочитать 32-битный целочисленный двоичный файл, предоставленный другой программой. Файл содержит только целые числа и другие символы (например, пробелы или запятые). Код C, чтобы прочитать этот файл выглядит следующим образом:Как читать сгенерированный сгенерированный двоичный файл в Lua

FILE* pf = fopen("C:/rktemp/filename.dat", "r"); 
int sz = width*height; 
int* vals = new int[sz]; 
int elread = fread((char*)vals, sizeof(int), sz, pf); 
for(int j = 0; j < height; j++) 
{ 
    for(int k = 0; k < width; k++) 
    { 
     int i = j*width+k; 
     labels[i] = vals[i]; 
    } 
} 
delete [] vals; 
fclose(pf); 

Но я не знаю, как читать этот файл в массив с помощью Lua.

Я пытался читать этот файл, используя io.read, но часть массива выглядит следующим образом:

~~~~~~ xxxxxxxxyyyyyyyyyyyyyyzzzzzzzz {{{{{{{{{|||| |||||}}}}}}}}}}} ~~~~~~~~~ xxxxxxxyyyyyyyyyyyyyyzzzzzz {{{{{{{{{{|||||||||}}}}} }}}}}} ~~~~~~~~~ xxyyyyyyyyyyyyyzzzzz {{{{{{|||}}} yyyyyyyyyyyz {{{yyyyyyyyÞľūơǿȵɶʢ˺̤̼ͽаҩӱľǿ جٴ ȵɶʢ ܷ ݸ˺ ໻ ⼼ ӱľǿ

Кроме того, код Matlab, чтобы прочитайте этот файл:

row = image_size(1); 
colomn = image_size(2); 
fid = fopen(data_path,'r'); 
A = fread(fid, row * colomn, 'uint32')'; 
A = A + 1; 
B = reshape(A,[colomn, row]); 
B = B'; 
fclose(fid); 

Я пробовал функцию для преобразования байтов в целое, мой код выглядит так:

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 sup_filename = '1.dat' 
    fid = io.open(sup_filename, "r") 
    st = bytes_to_int(fid:read("*all"):byte(1,4)) 
    print(st) 

    fid:close() 

Но до сих пор не читать этот файл должным образом.

+1

Это двоичный файл. вам нужно '' rb'' в 'io.open' – Roddy

+0

@Roddy Я попытался добавить это, но вывод всегда один 0, выход должен быть последовательностью целого. –

ответ

2

Вы звоните только bytes_to_int. Вам нужно позвонить ему за каждые int, которые вы хотите прочитать. например

fid = io.open(sup_filename, "rb") 
while true do 
    local bytes = fid:read(4) 
    if bytes == nil then break end -- EOF 
    local st = bytes_to_int(bytes:byte(1,4)) 
    print(st) 
end 

fid:close() 
+0

Он отлично работает, большое спасибо! –

Смежные вопросы