c битовая манипуляция (endianess) - PullRequest
2 голосов
/ 06 февраля 2020

Может кто-нибудь объяснить мне этот код, пожалуйста? Я получил некоторый байт-код от ассемблера, и теперь я должен использовать его на своей виртуальной машине. Этот код используется, но я не знаю, как он работает и для чего он используется.

static int32_t bytecode_to_int32 (const uint8_t* bytes)
{
  uint32_t result = (uint32_t)bytes[0] << 24 |
                    (uint32_t)bytes[1] << 16 |
                    (uint32_t)bytes[2] <<  8 |
                    (uint32_t)bytes[3] <<  0 ;
  return (int32_t)result;
}

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Создает 32-битное слово из 4 байтов. Например, если байты: 1-й: 0x12, 2-й: 0x34, 3-й: 0x56, 4-й: 0x78 Тогда:

static int32_t bytecode_to_int32 (const uint8_t* bytes)
{
  uint32_t result = (uint32_t)bytes[0] << 24 | // -> 0x12000000
                    (uint32_t)bytes[1] << 16 | // -> 0x00340000
                    (uint32_t)bytes[2] <<  8 | // -> 0x00005600
                    (uint32_t)bytes[3] <<  0 ; // -> 0x00000078
  return (int32_t)result; // bitwise oring this result -> 0x12345678
}
0 голосов
/ 06 февраля 2020

Эта функция пытается объединить четыре байта в uint8_t[4] в один uint32_t с байтовым порядком с прямым порядком байтов, преобразовать результат в int32_t со знаком и вернуть его.

, если вы передадите указатель на массив { 0xAA, 0xBB, 0xCC, 0xDD } функции, он объединит их в 32-разрядное целое число с самыми значимыми байтами целого числа, приходящимися на самые младшие адреса в массиве, что даст вам 0xAABBCCDD или -1430532899.

Однако, если массив, на который указывает аргумент bytes, имеет длину не менее четырех байтов, он имеет неопределенное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...