我希望将8个二进制数组合在一起,然后将其整形为矩阵,如图所示:
01001001 10110100 10111101 10000111
10110101 10100011 10110010 10111000
010
我的输入将是一个MP3文件。
我设法在8个二进制文件之后添加一个空格,但是不知道如何在4组8个二进制文件之后将它添加到新行。
我的Matlab编程是:
fid=fopen('mp3file.mp3','r','b');
x=uint8(fread(fid,'ubit1'));
a = 1;
if ( a+100 <= numel(x) )
B = x(a:a+25);
str = [repmat('%d', 1, 8) ' '];
fprintf(str,B);
end
output: 01001001 10110100 10111101 10000111 10110101 10100011 ...
我发现有类似的帖子,但是那个只适用于字符/字母,而不是二进制:(
有什么想法吗?
答案 0 :(得分:0)
使用正则表达式可能有一种很好的方法,但我对reshape
感觉更舒服,所以这是一个解决方案。
另外,我不确定你的文件阅读方式(你的阅读方式,但是你把它投入uint8
)。为什么不直接阅读uint8
?
所以序列是:读取文件中的所有字节(uint8
),使用dec2bin
函数转换为char,然后重塑为您指定的列数(带有litle扭曲到在中间添加空格。)
它是:
%% // read the file byte by byte (8 bits at a time)
fid = fopen('dice.png','r','b');
x = fread(fid,'*uint8') ;
fclose(fid); %// don't forget to close your file
%% // pad the end with 0 if we don't have a multiple of nByteColumn
nByteColumn = 4 ; %// your number of columns
nByte = length(x) ; %// total number of byte read from the file
nByte2pad = nByteColumn-mod(nByte,nByteColumn) ; %// number of byte to add to get a full array
x = [x ; zeros( nByte2pad , 1 , 'uint8' ) ]; %// do the padding
%% // now convert to alphanumeric binary (=string) and reshape to your liking
S = [repmat(' ',nByte+nByte2pad,1) dec2bin(x)].' ; %'// convert to char and add a whitespace in front of each byte/string
S = reshape( S , nByteColumn*9 , [] ).' ; %'// reshape according to your defined number of column
S(:,1) = [] ; %// remove the leading whitespace column
您获得了一个char
数组,其中包含您指定列数的所有值:
>> S(1:3,:)
ans =
10001001 01010000 01001110 01000111
00001101 00001010 00011010 00001010
00000000 00000000 00000000 00001101
答案 1 :(得分:0)
假设x
包含数据,使得数组的每个元素都是数字0或1,这个代码可以解决这个问题:
xs = char('0' + x);
xs = [xs , repmat(' ', 1, 8 - mod(numel(x), 8))];
xs = reshape(xs(:), 8, [])';
xg = cellstr(xs);
fprintf('%s %s %s %s\n', xg{:})
fprintf('\n')
逐行评论:
将整数数组转换为char数组(由Luis Mendo指出)a.k.a字符串:
xs = char('0' + x);
这使用“ASCII算术”:符号'0'和'1'在ASCII代码表中是顺序的。
将带有空格的字符串填充到8的倍数:
xs = [xs , repmat(' ', 1, 8 - mod(numel(x), 8))];
这里8 - mod(numel(x), 8)
计算使字符串长度为8的倍数所需的空格数。
使用reshape
组成8位数组:
xs = reshape(xs(:), 8, [])';
在此之后,xs
是一个二维字符数组,每行有一个8位数字组。
使用fprintf
打印:
xg = cellstr(xs);
fprintf('%s %s %s %s\n', xg{:})
fprintf('\n')
需要通过cellstr
转换为单元格数组,以便fprintf可以作为单独的参数提供给每一行,每个参数都匹配格式字符串中的%s
之一。额外的换行是必要的,因为它可能是最后一个输出行未完成。