Как преобразовать из беззнакового байта в целое число? - PullRequest
2 голосов
/ 08 апреля 2020

Я пытаюсь прочитать файл, который содержит неподписанные байты, и я пытаюсь прочитать их как целочисленный диапазон [0,255].

Когда я смотрю на расширенную таблицу 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;
}

Ответы [ 3 ]

2 голосов
/ 08 апреля 2020

Если вы видите много 195, вход, вероятно, в кодировке UTF-8 .

ASCII идет только до 127, нет единого стандартного "расширенного ascii" , Существует ISO-8859-1 , но у него нет . Возможно, вы ссылаетесь на CP 437 .

. Ваши дальнейшие шаги впадают в один из двух общих подходов:

  • Преобразование файла из UTF-8 в другая кодировка, такая как CP437, с использованием инструментов для вашей операционной системы или другим способом.
  • Считайте UTF-8 в вашей программе C; Вы можете сделать это с нуля или использовать уже существующую библиотеку.
0 голосов
/ 08 апреля 2020

Возможно, символ сохраняется в файле с использованием кодировки UTF-8.

Например, символ имеет шестнадцатеричный код Unicode 250c, а последовательность байтов UTF-8 равна e2 94 8c. e2 равно вашему десятичному значению 226, что предполагает, что ваш персонаж может фактически находиться в соседнем блоке Unicode и кодироваться в UTF-8.

Как было предложено в комментариях, это было бы очень полезно если вы предоставили hexdump файла, например, так:

hexdump -C inputs.txt
0 голосов
/ 08 апреля 2020

Этот код

   bytesread = read(fd, &temp, 1);

считывает один байт в первый байт unsigned 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.

...