分组二进制并在 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
之一。额外的换行符是必要的,因为它可能是最后一个输出行不完整。
我希望将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
之一。额外的换行符是必要的,因为它可能是最后一个输出行不完整。