Введите 4 байта в 4 байта - PullRequest
       8

Введите 4 байта в 4 байта

0 голосов
/ 25 февраля 2020

Если строка имеет вид:

char message[] = "HI THERE";

Как бы я взял первые четыре байта ("HI T") и типизировал бы их до 4-байтового целого числа?

Общее значение должно равняться 1411402056.

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Безопасный способ сделать это, который всегда будет работать, это просто сдвинуть каждый байт индивидуально:

uint32_t i = (uint8_t(message[0]) << 24) | (uint8_t(message[1]) << 16) | (uint8_t(message[2]) << 8) | uint8_t(message[3]);

Возможно, вам придется изменить порядок байтов в зависимости от порядка следования вашей строки.

Вы также можете просто переинтерпретировать приведение к целому числу в зависимости от порядкового номера строки, совпадающей с порядковым номером вашего процессора, от того, выровнена ли строка по правильной границе байта et c:

Int i = *reinterpret_cast<int*>(message);
1 голос
/ 25 февраля 2020

Самый простой способ:

int32_t num = *reinterpret_cast<int32_t*>(message);

Но это технически нарушение строгого алиасинга. Более безопасный способ:

int32_t num;
memcpy(&num, message, sizeof(num));

Хотя, чтобы быть по-настоящему безопасным, вы должны использовать подход со сдвигом битов, описанный в ответе Алана Биртлса.

Возможно, вам придется поменять порядок Впоследствии int байт, в зависимости от порядкового номера вашей системы.

...