组二进制并在8个数字后添加一个空格Matlab(重复)

时间:2015-01-31 16:59:28

标签: string matlab matrix binary mp3

我希望将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 ...

我发现有类似的帖子,但是那个只适用于字符/字母,而不是二进制:(

有什么想法吗?

2 个答案:

答案 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之一。额外的换行是必要的,因为它可能是最后一个输出行未完成。