Теперь есть unsigned char bytes[4], и я уже знал, что массив байтов генерируется из int на C++. Как я могу преобразовать массив обратно в int?
Зависит от того, как он был «сгенерирован из int в C++». Проголосовали за закрытие за отсутствие воспроизводимого примера.
Извините, не могли бы вы объяснить это более ясно? @AdrianoRepetti
На самом деле есть только один способ (без нарушения каких-либо правил, например, строгое алиасинг): побайтовое копирование. Либо через std::memcpy (но остерегайтесь проблем с порядок байтов); Или путем явного сдвига и побитового - или для объединения байтов в правильном порядке.
Обратите внимание, что на самом деле все еще существуют платформы, на которых sizeof(int) != 4 дает истинное значение, поэтому вам лучше использовать размер в битах, а не размер в байтах.
Вы можете взглянуть на github.com/fritzone/nap-script/blob/master/vm/byte_order.c, где эта проблема решена в более или менее независимой от платформы примечании. Имейте в виду, что в примере кода используется кодировка с прямым порядком байтов, поэтому, если ваша платформа отличается от указанной, это может быть для вас неприемлемым решением. (извиняюсь за ссылку на собственный проект, хоть и с открытым исходным кодом :))





Вы можете сделать это с помощью std::memcpy():
#include <iostream>
#include <cstring>
int main() {
unsigned char bytes[4]{ 0xdd, 0xcc, 0xbb, 0xaa };
int value;
std::memcpy(&value, bytes, sizeof(int));
std::cout << std::hex << value << '\n';
}
Вы не учитываете порядок байтов представления массива байтов. Я проголосовал против, но это не было учтено.
+1 Игнорируйте комментарии о порядке байтов. Это не снижает ценность данного решения. Часто нам не нужно заботиться о порядке байтов, потому что он остается неизменным (порядок байтов не может измениться во время выполнения программы).
@Hyena, это зависит от варианта использования. Если он сериализует данные, а затем отправляет их на другие компьютеры, это может вызвать неприятные сюрпризы.
I've already known that the byte array is generated from an int in C++.
Крайне важно знать, что как массив генерируется из int. Если массив был сгенерирован простым копированием байтов на том же процессоре, затем вы можете преобразовать обратно, просто скопировав:
int value;
assert(sizeof value == sizeof bytes);
std::memcpy(&value, bytes, sizeof bytes);
Однако, если массив может следовать другому представлению, отличному от того, которое использует ваш ЦП (например, если вы получили массив с другого компьютера по сети), тогда вы должны преобразовать представление. Чтобы преобразовать представление, вы должны знать, за каким представлением следуют исходные данные.
Теоретически вам нужно будет обрабатывать различные представления знаков, но на практике дополнение 2 довольно распространено. Фактически актуальным на практике соображением является байтовый порядок байтов.
В частности, следует упомянуть "порядок байтов". 4-байтовое целое число «255» может быть представлено как FF000000 (прямой порядок байтов) или 000000FF (прямой порядок байтов) в зависимости от машины, на которой оно находится. Если вы отправляете целые числа по сети, где вы не знаете порядок байтов другой машины, я бы не рекомендовал просто копировать необработанную память: вместо этого используйте битовые сдвиги и маски.
@ ZeroZ30o Я говорю о порядке байтов.
Извините, я хотел упомянуть об этом подробнее (и о методе битового сдвига), потому что считаю это "правильным" решением.
Просто
<<и&