Я хочу прочитать 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()
Но до сих пор не читать этот файл должным образом.
Это двоичный файл. вам нужно '' rb'' в 'io.open' – Roddy
@Roddy Я попытался добавить это, но вывод всегда один 0, выход должен быть последовательностью целого. –