Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将二进制字符串作为二进制写入文件_C_File Io_Binaryfiles_Binary Data - Fatal编程技术网

C 将二进制字符串作为二进制写入文件

C 将二进制字符串作为二进制写入文件,c,file-io,binaryfiles,binary-data,C,File Io,Binaryfiles,Binary Data,我想将一个只包含0和1的字符串写入一个输出文件,其中输出文件实际上只包含按字符串给定顺序排列的0和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",

我想将一个只包含0和1的字符串写入一个输出文件,其中输出文件实际上只包含按字符串给定顺序排列的0和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;
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{   
文件*输出文件;
out_file=fopen(“out”、“wb”);
字符s[]=“01010101010101010101”/*20个字符*/
int i;
对于(i=0;i<20;i++){
fwrite(&s[i],1,1,out_文件);
}
fclose(输出文件);
返回退出成功;
}
十六进制编辑器中的输出文件

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

因此,输出文件包含0和1的ascii值,而不是实际的0和1


谢谢

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

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

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

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

使用byte type而不是char并删除这些字符串,当然它显示0x30表示0,您要求它写入“0”而不是0。。。。 可以使用b字节b1=100001110B指定二进制;
当然,你不能用它来制作数组,如果你想要更长的数字,你就必须一个接一个地写它们,或者如果开源软件中还没有二进制字符串,你就必须编写一个方法\函数来解析二进制字符串。

使用byte type而不是char并删除这些字符串,当然它显示0x30代表0,你要求它写“0”而不是0。。。。 可以使用b字节b1=100001110B指定二进制;
当然,你不能用它来制作数组,如果你想要更长的数字,你必须一个接一个地写它们,或者写一个方法\函数来解析二进制字符串,如果开源中还没有这样的字符串。

如果你试图将字符串“011000100110101110100”表示为三个字节的值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;
}
无符号字符*转换(字符*输入)
{
int len=strlen(输入);
/*只能正确处理具有“完整”字节的字符串*/
无符号字符*rv=malloc(len/8);
char*cp;
无符号字符*dp=rv;;
char dp_inc=0;
for(cp=input;*cp;cp++){
*dp=(*dp)=8){
dp_inc=0;
dp++;
} 
}
返回rv;
}

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

如果您试图将字符串“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;
}
无符号字符*转换(字符*输入)
{
int len=strlen(输入);
/*只能正确处理具有“完整”字节的字符串*/
无符号字符*rv=malloc(len/8);
char*cp;
无符号字符*dp=rv;;
char dp_inc=0;
for(cp=input;*cp;cp++){
*dp=(*dp)=8){
dp_inc=0;
dp++;
} 
}
返回rv;
}

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

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

模板
void SetEnableFlags(滴度和比特标志、常数滴度和标志)
{
位标志=(位标志|标志);
}
常量无符号字符字节(常量字符数据[])
{
如果(Data==NULL){返回0;}
if(strlen(Data)<8){返回0;}
无符号字符字节=0;
SetEnableFlags(字节,(数据[0]-'0')*128);
SetEnableFlags(字节,(数据[1]-'0')*64);
SetEnableFlags(字节,(数据[2]-'0')*32);
SetEnableFlags(字节,(数据[3]-'0')*16);
SetEnableFlags(字节,(数据[4]-'0')*8);
SetEnableFlags(字节,(数据[5]-'0')*4);
SetEnableFlags(字节,(数据[6]-'0')*2);
SetEnableFlags(字节,(数据[7]-'0')*1);
返回字节;
}
常量布尔转换字节(字符字节[],常量字符二进制[])
{
如果((二进制==NULL)| |(字节==NULL)){return false;}
//检查它是8的幂
int Size=strlen(二进制);
如果(大小<8){返回false;}
浮动大小测试=((浮动)大小/8.0);
如果((SizeTest-(int)SizeTest)!=0.0){返回false;}
无符号整数幂=0;
无符号整数Iter=0;
做
{
功率=8*Iter;
字节[Iter]=字符字节((二进制+幂));
Iter++;
}而(功率<尺寸);
返回true;
}
int main()
{
字符字节[3];//为其分配足够的空间
字符二进制[]=“0000000 1000000111000111”;//1,3,15
if(!ConvertToBytes(Bytes,Binary)){return 1;}
printf(“%d%d%d!\n”,字节[0],字节[1],字节[2]);
返回0;
}
<>你可能也想考虑一下阅读以使你的工作更容易。

代码没有得到优化。你可以将它用于任何目的,甚至是商业用途(如果你能出售的话)。字符串超过8位时将无法读取,因此您可能只希望手动调用CharArrayToByte(确保char数组长度确实为8个字符,否则会出现问题)。如果您想将其转换回,则需要反转过程


不清楚你是用C还是C++(C编码),所以你可能需要修改它以适应你的需要。

< P>好的,这是你的解决方案(虽然它没有被彻底测试):

模板
void SetEnableFlags(滴度和位标志,c