【问题标题】:write a binary string as binary to file将二进制字符串作为二进制写入文件
【发布时间】:2011-10-09 13:02:30
【问题描述】:

我想将仅由零和一组成的字符串写入输出文件,其中输出文件实际上只包含字符串给出的顺序中的零和一。

目前我正在尝试将字符写入 1 位

#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main(int argc, char *argv[])
{   
FILE *out_file;

out_file = fopen("out", "wb");

char s[] = "01010101010101010101"; /*20 chars*/
int i;

for (i = 0; i < 20; i++) {
    fwrite(&s[i], 1, 1, out_file);
}

fclose(out_file);

return EXIT_SUCCESS;
}

十六进制编辑器中的输出文件

30 31 30 31 30 31 30 31 30 31 30 31 30 31 30 31 30 31 30 31

因此,输出文件包含零和一的 ascii 值,而不是实际的零和一。

谢谢

【问题讨论】:

  • 其实包含0和1:0x30 = 110000, 0x31 = 110001
  • 但 0x30 是 0 的 ascii 值
  • 我无法理解这个问题。你想写 (int)0 还是 (char)0?
  • 我只希望输出文件包含零和一,而不是在 ascii 中只是按该顺序排列

标签: c file-io binaryfiles binary-data


【解决方案1】:

在字符串文字中使用转义序列来表示字节 0x000x01,而不是字符 01

char s[] = "\x00\x01";

【讨论】:

    【解决方案2】:

    使用 byte 类型而不是 char 并删除那些字符串,当然它显示 0x30 表示 0,你要求它写 '0' 而不是 0.... 您可以使用 b byte b1 = 10001110b 指定二进制; 当然你不能用它做一个数组,如果你想要更长的数字,你必须一个一个地写出来,或者写一个方法\函数来为你解析二进制字符串,如果开源中不存在的话已经。

    【讨论】:

    • C99 可以。它被称为_Bool。如果包含&lt;stdbool.h&gt; 标头,则可以将其用作bool
    【解决方案3】:

    如果您尝试将字符串“011000100110100101110100”表示为三个字节值 98、105、116,您首先需要将它们从字符数组(或在 C 中调用的“字符串”)转换为数组数值。

    这样的事情可能是一个好的开始:

    unsigned char *convert(char *input)
    {
      int len = strlen(input);
      /* Can only correctly handle strings that have 'full' bytes */
      unsigned char *rv = malloc(len/8); 
      char *cp;
      unsigned char *dp = rv;;
      char dp_inc = 0;
    
      for (cp = input; *cp; cp++) {
        *dp = ((*dp) << 1) | (*cp == '1');
        if ((++dp_inc) >= 8) {
          dp_inc = 0;
          dp++;
        } 
      }
    
      return rv;
    }
    

    此例程遍历输入字符串并将其转换为它所代表的二进制数。它可能需要进行一些整理,因为它不一定是可读代码的典范,并且可能应该返回分配的字节数并采用范围限制器而不是依赖于 strlen。

    【讨论】:

      【解决方案4】:

      好的,这是您的解决方案(虽然它没有经过彻底测试):

      template<typename TItem, typename TItem2>
      void SetEnableFlags(TItem &BitFlags, const TItem2 &Flags)
      {
          BitFlags = (BitFlags|Flags);
      }
      
      const unsigned char CharArrayToByte(const char Data[])
      {
          if(Data == NULL){return 0;}
          if(strlen(Data) < 8){return 0;}
          unsigned char Byte = 0;
          SetEnableFlags(Byte,(Data[0]-'0')*128);
          SetEnableFlags(Byte,(Data[1]-'0')*64);
          SetEnableFlags(Byte,(Data[2]-'0')*32);
          SetEnableFlags(Byte,(Data[3]-'0')*16);
          SetEnableFlags(Byte,(Data[4]-'0')*8);
          SetEnableFlags(Byte,(Data[5]-'0')*4);
          SetEnableFlags(Byte,(Data[6]-'0')*2);
          SetEnableFlags(Byte,(Data[7]-'0')*1);
          return Byte;
      }
      
      const bool ConvertToBytes(char Bytes[], const char Binary[])
      {
          if( (Binary == NULL) || (Bytes == NULL) ){return false;}
      
          //Checks it's a power of 8
          int Size = strlen(Binary);
          if(Size < 8){return false;}
          float SizeTest = ((float)Size/8.0);
          if( (SizeTest - (int)SizeTest ) != 0.0 ){return false;}
      
          unsigned int Power = 0;
          unsigned int Iter = 0;
          do
          {
              Power = 8*Iter;
              Bytes[Iter] = CharArrayToByte( (Binary+Power)  );
              Iter++;
          }while(Power < Size);
          return true;
      }
      
      int main()
      {
          char Bytes[3]; //Allocate enough space for it
          char Binary[] = "000000010000001100001111"; //1, 3, 15
          if(!ConvertToBytes(Bytes,Binary)){return 1;}
      
          printf("%d %d %d!\n",Bytes[0],Bytes[1],Bytes[2]);
      
          return 0;
      }
      

      您可能还想考虑阅读this thread here 以使您的工作更轻松。

      代码未优化。你可以将它用于任何目的,甚至是商业用途(如果你能够出售它)。超过 8 位的字符串将变得不可读,因此您可能只想手动调用 CharArrayToByte(确保 char 数组长度确实是 8 个字符,否则您会遇到问题)。如果您想将其转换回来,则需要将过程颠倒过来。

      不清楚您使用的是 C 还是 C++(使用 C 编码),因此您可能必须对其进行修改以满足您的需要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-15
        • 2021-10-27
        • 2020-08-28
        • 2015-07-02
        • 2013-12-08
        • 1970-01-01
        • 2012-08-27
        • 2012-09-22
        相关资源
        最近更新 更多