C преобразовать из int в байтовый массив, затем преобразовать этот байтовый массив обратно в int, вызвать переполнение

#c #arrays #integer #byte #overflow

#c #массивы #целое число #байт #переполнение

Вопрос:

Я создаю многопользовательскую игру, в которой я использую CSocket для отправки данных между сервером и клиентами, и мне нужно передать необработанные байты. Итак, я проверил, как преобразовать целое число в байтовый массив и наоборот, это то, что я тестировал:

 int test1 = 257;
byte bytes[4];
copy(amp;test1, amp;test1   3, bytes);

int test2;
copy(bytes, bytes   3, amp;test2);
cout << "Test " << test2 << endl;
 

Переменная test2 при распечатке имеет значение не 257, а 1, я думаю, это потому, что тип byte (unsigned char) имеет размер 256, и он испытывает переполнение. Могу ли я в любом случае правильно преобразовать?

Ответ №1:

Вот ваш исправленный код

 int test1 = 257;
byte bytes[4];
copy((char*)amp;test1, (char*)amp;test1   4, bytes);

int test2;
copy(bytes, bytes   4, (char*)amp;test2);
cout << "Test " << test2 << endl;
 

Я преобразую все указатели в указатели char, и я использую 4, а не 3. 3 копирует только три байта, поэтому не удается скопировать последний байт.

Ответ №2:

Вся арифметика указателей будет выполняться в единицах базового типа.

Для указателя на int ( int* ) затем добавление 3 добавит смещение в байтах 3 * sizeof(int) .

Таким образом, вызов copy(amp;test1, amp;test1 3, bytes) скопирует 3 int значения в четырехбайтовый массив.

Чтобы скопировать только один int , добавьте 1 вместо него:

 copy(amp;test1, amp;test1   1, bytes);
 

Это может помочь увидеть любой указатель как указатель на первый элемент массива.

Поскольку amp;test1 тогда его можно рассматривать как указатель на первый элемент массива из одного int элемента.


И, как упоминалось в комментарии (спасибо, что указал на это, Джон), вы копируете только три байта из bytes массива test2 .

Конечный «итератор» должен быть на один элемент за концом, который является указателем bytes[4] . То есть вам нужно

 copy(bytes, bytes   4, amp;test2);
 

Комментарии:

1. 3 При копировании байтов обратно в int возникает другая ошибка

2. Мне также интересно, есть ли возможная проблема с кодом. Копирование в массив bytes выполняется как один int, но копирование обратно выполняется как байты.

3. @john Не должно быть никаких проблем с порядковым номером, если копирование туда и обратно выполняется в одной и той же системе.