C 如何将无符号字节转换为整数?
我试图读取一个包含无符号字节的文件,并试图将其读取为[0255]的整数范围 当我看到扩展ascii表时,当我读到“┌", 它等于218,但我的程序取195或226,我不知道为什么 这个问题也发生在扩展部分中的许多字符上(超过128个) 为什么我不能以ASCII等效形式读取,如何解决这个问题? 谢谢你的回复 这是我的密码C 如何将无符号字节转换为整数?,c,file,byte,ascii,extended-ascii,C,File,Byte,Ascii,Extended Ascii,我试图读取一个包含无符号字节的文件,并试图将其读取为[0255]的整数范围 当我看到扩展ascii表时,当我读到“┌", 它等于218,但我的程序取195或226,我不知道为什么 这个问题也发生在扩展部分中的许多字符上(超过128个) 为什么我不能以ASCII等效形式读取,如何解决这个问题? 谢谢你的回复 这是我的密码 int main() { unsigned int temp = 0; int bytesread; int fd = open("inputs.txt",
int main()
{
unsigned int temp = 0;
int bytesread;
int fd = open("inputs.txt", O_RDONLY);
if(fd == -1)
{
printf("An error occured.. \n");
exit(-1);
}
else
{
bytesread = read(fd, &temp, 1);
}
printf("%d", temp);
return 0;
}
此代码
bytesread = read(fd, &temp, 1);
将一个字节读入无符号int
的第一个字节,该字节几乎肯定大于一个字节。因此,您读取的数据在int
值中的位置取决于您的系统
如果要读取单个字节,通常只使用[unsigned]char
会容易得多,因此总是知道它的结尾。要将unsigned char
转换为int
,只需分配它:
int main()
{
int fd = open("inputs.txt", O_RDONLY);
if(fd == -1)
{
// perror() will tell you **WHAT** error occurred
perror( "open()" );
exit(-1);
}
// this is now an unsigned char
unsigned char temp;
// read() returns ssize_t, not int
ssize_t bytesread = read( fd, &temp, sizeof( temp ) );
if ( bytesread != sizeof( temp ) )
{
perror( "read()" );
close( fd );
exit( -1 );
}
close( fd );
// there are a lot of ways to do this
printf( "unsigned int value: %u\n", ( unsigned int ) temp );
// this is another way - it prints the hex value
printf( "hex value: %hhx\n", temp );
// this prints the char value:
printf( "char value: '%c'\n", temp;
// this converts that unsigned char into an int:
int intvalue = temp;
// yes, it's that simple.
printf( "int value: %d\n", intvalue );
return 0;
}
请注意,如果
sizeof(int)==sizeof(unsigned char)
,结果可能会有所不同。在这种情况下,可能会有unsigned char
值无法表示为int
值。如果您看到大量195,则输入可能在
ASCII只升到127,没有单一的标准“扩展ASCII”。有,但没有┌代码>。也许您指的是
从这里开始,您的前进道路将分为两大途径之一:
- 使用适用于操作系统的工具或其他方式,将文件从UTF-8转换为其他编码,如CP437
- 在您的C程序中读取UTF-8;您可以从头开始执行此操作,也可以使用预先存在的库
字符可能使用UTF-8编码存储在文件中
例如,字符┌
有一个Unicode十六进制码点250c
,UTF-8字节序列是e2 94 8c
。e2
等于十进制226
,这表明您的字符实际上可能位于附近的Unicode块中,并进行UTF-8编码
正如评论中所建议的,如果您提供文件的hexdump,将非常有帮助,例如:
hextump-C inputs.txt
您能提供文件的hexdump吗?我想您的文件不是ascii格式的,您可以输入字符“┌“是否存储为94e2 0a8c而不是da0a@Ôrel:0a
是新行字符,不是的编码的一部分”┌“。如果您在Unix系统上,请键入od-xa inputs.txt
以十六进制形式查看文件中的实际字节,或键入od-tuC-a inputs.txt
以十进制形式查看它们。如果文件很大,请使用od-tuC-a inputs.txt;更多
来控制输出。您可能会看到文件中的字节与您所想的不一样。没有理由这样做。”unsigned int temp=0;
和read(fd,&temp,1)
。建议unsigned char temp=0;
设置该边问题。这无法解释OP观察到的结果,因为temp
初始化为0,并且通过修改对象的一个字节来修改对象是行为定义的(部分实现定义),因此结果必须是temp
中的低寻址字节被设置为读取的字节,并且,无论temp
中的字节顺序如何,这都不会导致输入字节218的值为195或226。@EricPostpischil通过修改对象的一个字节来修改对象是定义的行为(部分实现定义)”-->Hmmm,在带有填充(奇偶校验位)的无符号
的unicorn land中,我有疑问。IAC,OP应该使用无符号字符临时;
@chux:C 2018 6.2.5 2除位字段外,对象由一个或多个字节的连续序列组成,其数量、顺序和编码是显式指定的或实现定义的因此,如果我知道对象中的字节,并将其中一个字节修改为我知道的值,我可以使用显式指定或实现定义的信息计算出表示的值。当然,这可能是一个陷阱值,使用它可能会导致C标准未定义的行为,但这是另一回事。