分组二进制并在 8 个数字后添加 space Matlab(重复)

Group Binary and add a space after 8 numbers Matlab (Duplicate)

我希望将8个二进制数组合在一起,然后将其整形为如图所示的矩阵:

01001001  10110100  10111101  10000111
10110101  10100011  10110010  10111000
010

我的输入将是一个 MP3 文件。

我设法在 8 个二进制后添加一个 space,但不知道如何在 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 ...

我发现有与此类似的 post,但那个只适用于 characters/alphabet,不适用于二进制 :(

有什么想法吗?

使用正则表达式可能有一个很好的方法,但我更喜欢 reshape 所以这里有一个解决方案。

另外,我不确定您读取文件的方式(您是一点一点地读取,然后将其转换为 uint8)。为什么不直接读 uint8 ?

所以序列是:读取文件中的所有字节(uint8),使用dec2bin函数转换为char,然后reshape为您指定的列数(带有一点扭曲以在中间添加空格)。

结果是:

%% // 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

假设 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')

逐行解说:

将整数数组转换为字符数组(正如 Luis Mendo 所指出的)a.k.a 字符串:

xs = char('0' + x);

这里使用了"ASCII arithmetic": 符号'0'和'1'在ASCII码中依次排列table.

用空格填充字符串到8的倍数:

xs = [xs , repmat(' ', 1, 8 - mod(numel(x), 8))];

此处8 - mod(numel(x), 8)计算需要多少个空格才能使字符串长度成为8的倍数。

使用reshape组成8位数字组:

xs = reshape(xs(:), 8, [])';

之后xs是一个二维字符数组,每行一个8位数字组。

打印使用 [​​=19=]:

xg = cellstr(xs);
fprintf('%s %s %s %s\n', xg{:})
fprintf('\n')

必须通过 cellstr 转换为元胞数组,以便 fprintf 可以将每一行作为单独的参数提供,每行都匹配格式字符串中的 %s 之一。额外的换行符是必要的,因为它可能是最后一个输出行不完整。