Как я могу наложить char на неподписанный int? - PullRequest
11 голосов
/ 25 октября 2011

У меня есть массив символов, который действительно используется как байтовый массив, а не для хранения текста.В массиве есть два конкретных байта, которые представляют числовое значение, которое мне нужно сохранить в беззнаковом значении int.Код ниже объясняет настройку.

char* bytes = bytes[2];
bytes[0] = 0x0C; // For the sake of this example, I'm 
bytes[1] = 0x88; // assigning random values to the char array.

unsigned int val = ???; // This needs to be the actual numeric 
                        // value of the two bytes in the char array.  
                        // In other words, the value should equal 0x0C88;

Я не могу понять, как это сделать.Я предполагаю, что это потребует некоторого приведения и изменения указателей, но я не могу заставить это работать.Как мне достичь своей конечной цели?

ОБНОВЛЕНИЕ

Спасибо Мартину Б за быстрый ответ, однако это не сработает.В частности, в моем случае это два байта 0x00 и 0xbc.Очевидно, что я хочу это 0x000000bc.Но то, что я получаю в своем неподписанном int, это 0xffffffbc.

Код, который был размещен Мартином, был моим настоящим, оригинальным кодом и прекрасно работает, пока все байты меньше 128 (.т.е. положительные значения знаков со знаком.)

Ответы [ 5 ]

16 голосов
/ 25 октября 2011
unsigned int val = (unsigned char)bytes[0] << CHAR_BIT | (unsigned char)bytes[1];

Это если sizeof(unsigned int) >= 2 * sizeof(unsigned char) (не то, что гарантировано стандартом C)

Теперь ... Интересно, что здесь, конечно, порядок операторов (через много лет все еще я могу помнить только +, -, * and / ... Позор мне :-), поэтому я всегда ставлю столько скобок, сколько могу).[] это король.Второе это (cast).Третье - <<, а четвертое - | (если вы используете + вместо |, помните, что + важнее <<, поэтому вам понадобятся браслеты)

Нам не нужно повышать до (unsigned integer) двух (unsigned char), потому что есть интегральная акция , которая сделает это для нас для одного, а для другого она должна быть автоматической Арифметическое преобразование .

Я добавлю это, если вы хотите меньше головной боли:

unsigned int val = (unsigned char)bytes[0] << CHAR_BIT;
val |= (unsigned char)bytes[1];
4 голосов
/ 25 октября 2011
unsigned int val = (unsigned char) bytes[0]<<8 | (unsigned char) bytes[1];
1 голос
/ 25 октября 2011

Порядок байтов зависит от порядкового номера вашего процессора.Вы можете сделать это, что будет работать на больших или маленьких порядковых машинах.(без ntohs он будет работать на big-endian):

unsigned int val = ntohs(*(uint16_t*)bytes)
0 голосов
/ 25 октября 2011

Я думаю, что это лучший способ, чем полагаться на псевдонимы указателей:

union {unsigned asInt; char asChars[2];} conversion;
conversion.asInt = 0;
conversion.asChars[0] = 0x0C;
conversion.asChars[1] = 0x88;
unsigned val = conversion.asInt;
0 голосов
/ 25 октября 2011
unsigned int val = bytes[0] << 8 + bytes[1];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...