#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 Не должно быть никаких проблем с порядковым номером, если копирование туда и обратно выполняется в одной и той же системе.