【问题标题】:add space after every byte to a binary file在二进制文件的每个字节后添加空格
【发布时间】:2023-04-08 13:09:01
【问题描述】:

我有一个图像的二进制文件,它是 256x256 数组 我只想在此文件中的每个字节后添加一个空格 例如 000101010101110101010100
预期输出:00010101 01011101 01010100
任何人都可以使用 matlab 建议我这样做吗

【问题讨论】:

  • 您已经阅读过文件了吗?您在矩阵、向量、字符数组中是否有那些 0/1 值...?
  • 是为了展示吗?还是您要实际更改保存的值?
  • 是的,我已经有了这个文件。我有一个 256x256 阵列。我所做的是对矩阵进行转置并将其调整为 8192 行和 8 列。但这会导致读取所有数据的许多行地址。所以我想把每个字节分开,这样我就可以直接从同一行读取它们。
  • 是的,我希望我的 fpga 将这些数据读取为字节。因此,除非我将字节分开,否则它将把整行读取为单个数据值。
  • 所以你有一个 65,536 字节的二进制文件,你希望它变成 131,072 字节的文件,其中每个第二个字节是一个空格。对吗?

标签: image matlab binary byte whitespace


【解决方案1】:

如果你已经有 char 数组形式的那些 0/1 值,比如

a =
101001011111011101010100
100101001010100000111111
100100100001011110110101
001010011111110000001010

你可以这样做:

n = 8; %// byte size
b = a(:,ceil(n/(n+1):n/(n+1):end)); %// repeat every n-th position
b(:,n+1:n+1:end) = ' '; %// replace those repeated positions by spaces

给了

b =
10100101 11110111 01010100 
10010100 10101000 00111111 
10010010 00010111 10110101 
00101001 11111100 00001010 

【讨论】:

    【解决方案2】:

    ...要获取Luis Mendo 提到的字符数组,您可以执行以下操作:

    %edge length of image
    edge = 256;
    
    %open and read file
    fid = fopen('imageData.txt');
    C = fread(fid,[edge+2,edge]);
    

    +2 实际上取决于您的文件,它是否包含回车?如果没有,请忽略它。

    % get char array
    chararray = char(C(1:edge,:)');
    

    那么我会按照以下方式进行:

    wordlength = 8;
    cellarray = mat2cell(chararray,ones(1,edge),wordlength*ones(1,edge/wordlength));
    cellarray = cellfun(@(x) [x ' '],cellarray,'uni',0);
    output = cell2mat(cellarray);
    %// remove last column with unwanted space
    output = output(:,end-1:end)
    

    然后再次将其写入文件。


    关于你的评论,试试这个:

    wordlength = 8;
    cellarray = mat2cell(chararray,ones(1,edge),wordlength*ones(1,edge/wordlength));
    fid2 = fopen( yourFilepath ,'w');
    fprintf(fid2 , '%s\r\n', cellarray {:});
    fclose(fid2);
    

    【讨论】:

    • 当我尝试按照您从我的数据文件中所说的那样创建一个字符数组时,行尾会出现不需要的回车,并且每次将越来越多的位放入新的行。(第 1 行在字符数组中有 256 位,下一行有 255 位,第 3 行有 1 位,第 4 行有 254 位,第 5 行有 2 位)这会影响字节之间空间的输入。如何避免这种情况
    • 如果您提供文件,那么最简单的帮助您的方法就是。关键是:您的文件是否有换行符? -> +1!你的文件有回车吗? -> +1!两者都有吗? +2(在C = fread(fid,[edge+2,edge]);行中)
    • 我搞定了。另一件事,如果我想添加换行符而不是空格,该怎么做?即 00000000 00000000 而不是这个,我希望每个字节都换行。
    • 试过这段代码。它所做的只是打印彼此下方的每个字节列。我想让一行中的每个字节先换行,然后是下一行。我会重新编辑我的要求。感谢您的帮助
    • 我不明白。是的,我认为您的问题需要更具体。请添加示例文件
    【解决方案3】:

    您可以使用简单的 Perl 单行代码来完成:

    perl -e '$/=\1;while(<>){print $_," ";}' < yourFile > newfile
    

    $/=\1 设置记录分隔符,因此我们一次读取一个字节。然后我们进入一个循环,一次读取一个字节,打印出来,然后是一个空格,直到文件结束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 2014-04-17
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      相关资源
      最近更新 更多