将二进制字符串写为二进制文件

时间:2011-10-09 13:02:30

标签: c file-io binaryfiles binary-data

我想写一个只包含0和1的字符串到输出文件,其中输出文件字面上只包含字符串给出的顺序的零和1。

目前我正在尝试将字符写入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值,而不是实际的零和一。

谢谢

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果您尝试将字符串“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。

答案 3 :(得分:0)

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

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编码),因此您可能需要对其进行修改以满足您的需求。