Typecasting в C, большая проблема - PullRequest
2 голосов
/ 11 декабря 2011

В настоящее время я не могу понять, как правильно вводить информацию о касте.

Мне дан буфер двоичных данных, доступ к которому осуществляется из char*, и мне нужно извлечь всю информацию, которую он хранит. Я знаю, что мне следует набирать текст, но я делаю что-то не так!

Функции типа atoi, atol, atof не работают, потому что это не строка чисел, а скорее как строка 0 s и 1 s, которые необходимо интерпретировать как числа .

В широком смысле вы можете думать об этом как о следующем формате char long int char unsigned int double, Теперь, если бы я хотел получить эту первую строку, я делал бы что-то вроде:

char temp_c1 = (char)*(buffer);
long int temp_i = (long int)*(buffer+1);
char temp_c2 = (char)*(buffer+5);
unsigned int temp_ui = (unsigned int)*(buffer+6);
double temp_d = (double)*(buffer+10);

Мои значения для long int, unsigned int и double все неверны, но оба char s верны. Я не понимаю, как правильно типизировать строку двоичных данных для типов long int, unsigned int и double. У кого-нибудь есть идеи?

Ответы [ 3 ]

3 голосов
/ 11 декабря 2011

Скорее всего, проблема с порядком байтов .

Целое число 0x00001034 может храниться в младшем или старшем порядке следующим образом:

  • { 0x00, 0x00, 0x10, 0x34 }
  • { 0x34, 0x10, 0x00, 0x00 }

Предлагаю прочитать эту статью:

Кроме того, вы не должны предполагать, что long int или unsigned int - это ровно 4 байта.Это зависит от архитектуры вашего компьютера и компилятора.

0 голосов
/ 11 декабря 2011

У меня сложилось впечатление, что вы неправильно поняли разыменование.Что-то вроде

long int temp_i = (long int)*(buffer+1);

сначала разыменовывает a char* и получает char, скажем 'a', что для C является просто (небольшим) числом.Затем вы приводите это к long int.

. Возможно, вы имели в виду

long int temp_i = *(long int*)(buffer+1);

, который сначала интерпретирует char* как указатель на long int, затем разыменованияэто следует считать числом правильной ширины.

Но, как указывает Йоргенсен, будьте осторожны с выравниванием.Не все типы могут начинаться с любого байтового адреса.

0 голосов
/ 11 декабря 2011

С

long int temp_i = (long int)*(buffer+1);

(и другими) вы, вероятно, вызываете неопределенное поведение из-за разыменования указателей на невыровненные данные, которые могут проявляться как «неправильные» (

...