我想写一个只包含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值,而不是实际的零和一。
谢谢
答案 0 :(得分:1)
在字符串文字中使用转义序列来表示字节0x00
和0x01
,而不是字符0
和1
:
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编码),因此您可能需要对其进行修改以满足您的需求。