我正在尝试将一些2D坐标写入二进制文件。但是,我从已经写入的文件中读取的内容与原始数据完全不同。详情请见这里。
例如,我有45(X,Y)点。 X和Y都是小于600的整数。模拟需要将每个字节存储为两个字节(8位),并保留每个字节的2个高位(对于X,保留位由.mrk填充,即1或2;对于Y,只需使用0代替)。在这种情况下,14位二进制数能够代表最大值16383.我用几种方式写数据:
in_tmp是由点号(.nm),点保留标记(.mrk)和点坐标(.coor)组成的结构
for i=1:in_tmp.nm
x1 = dec2bin(in_tmp.coor(i,1));
y1 = dec2bin(in_tmp.coor(i,2));
t1 = in_tm.mrk(i);
if(t1==1)
t2 = '01';
t2b = 1;
elseif(t1==2)
t2 = '10';
t2b = 2;
end
lenx = 16-length(x1);
leny = 16-length(y1);
x1hl = strcat(t2, '00000000000000'); % High and low
y1hl = '0000000000000000';
x1a = strcat(x1hl(1:lenx), num2str(x1));
y1a = strcat(y1hl(1:leny), num2str(y1));
y1a(1:2) = '00';
% x1b = in_tmp.coor(i,1);
% y1b = in_tmp.coor(i,2);
% fwrite(fp1, t2b, 'ubit2');
% fwrite(fp1, x1b, 'ubit14');
%
% fwrite(fp1, 0, 'ubit2');
% fwrite(fp1, y1b, 'ubit14');
fwrite(fp1, bin2dec(x1a), 'uint16');
fwrite(fp1, bin2dec(y1a), 'uint16');
% fwrite(fp1, bin2dec(x1a(1:8)), 'uint8');
% fwrite(fp1, bin2dec(x1a(9:end)), 'uint8');
% fwrite(fp1, bin2dec(y1a(1:8)), 'uint8');
% fwrite(fp1, bin2dec(y1a(9:end)), 'uint8');
% x1c = in_tmp.coor(i,1);
% y1c = in_tmp.coor(i,2);
%
% x1hex = dec2hex(x1c);
% y1hex = dec2hex(y1c);
% if(length(x1hex)>2)
% x1h = x1hex(1:end-2);
% x1l = x1hex(end-1:end);
% else
% x1h = dec2hex(0);
% x1l = x1hex;
% end
%
% tx1h = dec2bin(hex2dec(x1h));
% l1 = length(tx1h);
% bin0 = dec2bin(128); % '10000000'
% if(t1==1)
% bin0(end-l1+1:end) = tx1h;
% bin0(1)=0;
% bin0(2)=1;
%
% elseif(t1==2)
% bin0(end-l1+1:end) = tx1h;
% end
% x1h = bin2dec(tx1h);
%
% if(length(y1hex)>2)
% y1h = y1hex(1:end-2);
% y1l = y1hex(end-1:end);
% else
% y1h = dec2hex(0);
% y1l = y1hex;
% end
% fwrite(fp1, x1h, 'uint8');
% fwrite(fp1, hex2dec(x1l), 'uint8');
% fwrite(fp1, hex2dec(y1h), 'uint8');
% fwrite(fp1, hex2dec(y1l), 'uint8');
end
我读它的方式
for i=1:mt.nm % nm points.
mred(i,6) = fread(fp1, 1, 'uint8'); % Raw X coordinates.
mred(i,7) = fread(fp1, 1, 'uint8'); % upper 2 bits are reserved info.
tmpx = [dec2bin(mred(i,6)), dec2bin(mred(i,7))];
if(length(tmpx)==16)
mred(i,4) = bin2dec(tmpx(1:2)); % Real Mark.
mred(i,1) = bin2dec(tmpx(3:end)); % Real X.
elseif(length(tmpx)==15)
mred(i,4) = bin2dec(tmpx(1)); % Real Type.
mred(i,1) = bin2dec(tmpx(2:end)); % Real X.
else
mred(i,4) = bin2dec(tmpx(1:2)); % Type unknown.
mred(i,1) = bin2dec(tmpx(3:end)); % Real X.
end
mred(i,8) = fread(fp1, 1, 'uint8'); % Y coordinates.
mred(i,9) = fread(fp1, 1, 'uint8'); % upper 2 bits are reserved.
tmpy = [dec2bin(mred(i,8)), dec2bin(mred(i,9))];
if(length(tmpy)==16)
mred(i,10) = bin2dec(tmpy(1:2)); % Real reserved.
mred(i,2) = bin2dec(tmpy(3:end)); % Real Y.
elseif(length(tmpy)==15)
mred(i,10) = bin2dec(tmpy(1)); % Real reserved.
mred(i,2) = bin2dec(tmpy(2:end)); % Real Y.
else
mred(i,10) = -1; % Reserved unknown.
mred(i,2) = bin2dec(tmpy); % Real Y.
end
end
read()函数适用于通过C ++实现的给定软件。该软件以这种格式生成坐标系列。然后,我准备一个read()来获取C ++软件生成的二进制文件中的信息。然后,我想以该格式使用Matlab实现write(),但是read()无法获得我写入二进制文件的内容。有人帮忙吗?感谢。
答案 0 :(得分:0)
问题可能(至少部分)是一个endian问题。
在intel架构(小端)上,读取两个字节为uint8
,然后附加二进制表示,通常不会给你带来与读取两个字节uint16
相同的结果。
以下脚本说明了如何交换两个uint8的顺序。
我更改了一些变量名称,使可读性更加简洁。
% declare an input int and the header (in binary string rep)
v = 68;
t2 = '01';
% write to file
x1 = dec2bin(v);
lenx = 16-length(x1);
x1hl = strcat(t2, '00000000000000'); % High and low
x1a = strcat(x1hl(1:lenx), num2str(x1));
% x1a = 0100000001000100
fp1=fopen('temp','w+');
fwrite(fp1, bin2dec(x1a), 'uint16');
% read the file
frewind(fp1);
vtest = fread(fp1, 1, 'uint16'); % upper 2 bits are reserved info.
dec2bin(vtest)
% ans = 100000001000100
% now read *two* bytes as two uint8
frewind(fp1);
byte1 = fread(fp1, 1, 'uint8'); % Raw X coordinates.
byte2 = fread(fp1, 1, 'uint8'); % upper 2 bits are reserved info.
tmpx = [dec2bin(byte2) dec2bin(byte1)]; % <-- swap the order
% tmpx = 10000001000100
或者只是将整个2个字节作为uint16读取并从那里开始工作。