Целое число до двух ди git Шестнадцатеричный в C / C ++ - PullRequest
0 голосов
/ 22 марта 2020

У меня есть массив шестнадцатеричных байтов

byte hex= {0xAA, 0x55, 0x00, 0x00}

У меня также есть целочисленное значение, скажем

int val= 10;

Теперь я хочу преобразовать целочисленное значение в 4 di git шестнадцатеричное значение, например 0x000A, и сохранить его в шестнадцатеричном [3] и шестнадцатеричном [2] первой и последней 2 цифрах соответственно.

Например:

int val=10;
//in hex val=0x000A
msb= 0x00;
lsb= 0x0A;
hex[3]= msb;
hex[2]= lsb;
//so my final hex array will be 
hex[]={0xAA, 0x55, 0x0A, 0x00}

//here is another example:
int val=300;
//in hex val=0x012C
msb= 0x01;
lsb= 0x2C;
hex[3]= msb;
hex[2]= lsb;
//so my final hex array will be 
hex[]={0xAA, 0x55, 0x2C, 0x01}

Как я могу реализовать в C или C ++? Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 22 марта 2020

Простой

int val = 10;
int msb = val/256;
int lsb = val%256;
hex[3] = msb;
hex[2] = lsb;

Не работает для отрицательных целых чисел или целых чисел с более чем 16 значащими битами. Но я думаю, вас это не волнует.

В вашем вопросе есть намек на то, что у вас есть общее недоразумение ie, что есть фундаментальное различие между шестнадцатеричными и десятичными целыми числами. Нет, все целые числа одного типа (обычно двоичные). Десятичное и шестнадцатеричное - это просто разные способы печати целых чисел, а не разные способы, которыми язык C ++ представляет целых чисел.

0 голосов
/ 22 марта 2020

Похоже, вы имеете дело с порядком байтов здесь. union может помочь

#include <iostream>

union U {
  uint32_t val;
  uint8_t hex[4];
};

int main() {
  U u{0x12345678};
  std::cout << std::hex << u.val << std::endl;
  for (const auto h : u.hex) {
    std::cout << std::hex << static_cast<uint32_t>(h) << std::endl;
  }
}
...