C ++ Чтение со знаком 32-битное целое значение - PullRequest
0 голосов
/ 14 июля 2010

У меня есть многобайтовый примитивный тип с именем s32, который я хочу прочитать из байтового массива.

Технические характеристики:

  • Это 32-разрядное целое число со знаком, хранящееся в порядке с прямым порядком байтов.* Отрицательные целые числа представлены с использованием дополнения 2.

  • Используется от 1 до 5 байтов в зависимости от величины.Каждый байт вносит свои младшие семь битов в значение.Если старший (8-й) бит установлен, то следующий байт также является частью значения.

  • Применяется расширение знака: седьмой бит последнего байта кодирования равенраспространяется для заполнения 32 битов декодированного значения.

В случае U32 - беззнакового 32-битного я придумал это (любые комментарии приветствуются!), Но не уверен, как изменить его для S32.

char temp = 0; 
u32 value = 0;
size_t index = 0;

for(int i = 0; i < 5; i++)
{
    if(i < 4)
    {
        temp  = 0x7F & buffer[index];
    }
    else
    {
        temp = 0x0F & buffer[index];
    }

    value |= temp << (7 * i);

    if(!(0x80 & buffer[index])) break;

    ++index;
}

Спасибо всем!

Ответы [ 2 ]

0 голосов
/ 14 июля 2010

Я разместил макрос SIGN_EXTEND в ответе на этот вопрос .Для вашего кода я бы изменил ваш u32 value на s32 value и применил SIGN_EXTEND как

// after loop close
SIGN_EXTEND(value, index * 7, u32);

, используя принятый ответ на вопрос, вы бы сказали:

if(value > (1 << (index * 7 - 1))
    value -= (1 << (index * 7));
0 голосов
/ 14 июля 2010

Вы работаете в системе с прямым порядком байтов?
Если это так, следуйте этой инструкции.

if(!(0x80 & buffer[index])) 
{
  if(0x40 & buffer[index])  value = -value;
  break;
}

Если вам нужна отрицательная величина с прямым порядком байтов в большой порядковой системе, то это немного сложнее, но это требование показалось бы мне очень странным

...