C 如何将无符号字节转换为整数?

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",

我试图读取一个包含无符号字节的文件,并试图将其读取为[0255]的整数范围

当我看到扩展ascii表时,当我读到“┌", 它等于218,但我的程序取195或226,我不知道为什么

这个问题也发生在扩展部分中的许多字符上(超过128个)

为什么我不能以ASCII等效形式读取,如何解决这个问题? 谢谢你的回复

这是我的密码


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标准未定义的行为,但这是另一回事。