С ++ байтовый массив в int

Теперь есть unsigned char bytes[4], и я уже знал, что массив байтов генерируется из int на C++. Как я могу преобразовать массив обратно в int?

Просто << и &

Adriano Repetti 25.09.2018 08:54

Зависит от того, как он был «сгенерирован из int в C++». Проголосовали за закрытие за отсутствие воспроизводимого примера.

Cheers and hth. - Alf 25.09.2018 08:56

Извините, не могли бы вы объяснить это более ясно? @AdrianoRepetti

maxwellhertz 25.09.2018 08:57

На самом деле есть только один способ (без нарушения каких-либо правил, например, строгое алиасинг): побайтовое копирование. Либо через std::memcpy (но остерегайтесь проблем с порядок байтов); Или путем явного сдвига и побитового - или для объединения байтов в правильном порядке.

Some programmer dude 25.09.2018 08:57

Обратите внимание, что на самом деле все еще существуют платформы, на которых sizeof(int) != 4 дает истинное значение, поэтому вам лучше использовать размер в битах, а не размер в байтах.

Ferenc Deak 25.09.2018 09:00

Вы можете взглянуть на github.com/fritzone/nap-script/blob/master/vm/byte_order.c, где эта проблема решена в более или менее независимой от платформы примечании. Имейте в виду, что в примере кода используется кодировка с прямым порядком байтов, поэтому, если ваша платформа отличается от указанной, это может быть для вас неприемлемым решением. (извиняюсь за ссылку на собственный проект, хоть и с открытым исходным кодом :))

Ferenc Deak 25.09.2018 09:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
6
17 476
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете сделать это с помощью 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 Вы не знаете, как был сгенерирован массив байтов.
Cheers and hth. - Alf 25.09.2018 09:00

Вы не учитываете порядок байтов представления массива байтов. Я проголосовал против, но это не было учтено.

user1741137 13.04.2020 16:13

+1 Игнорируйте комментарии о порядке байтов. Это не снижает ценность данного решения. Часто нам не нужно заботиться о порядке байтов, потому что он остается неизменным (порядок байтов не может измениться во время выполнения программы).

Hyena 15.09.2020 14:40

@Hyena, это зависит от варианта использования. Если он сериализует данные, а затем отправляет их на другие компьютеры, это может вызвать неприятные сюрпризы.

ZeroZ30o 13.08.2021 00:31

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 13.08.2021 00:30

@ ZeroZ30o Я говорю о порядке байтов.

eerorika 13.08.2021 08:45

Извините, я хотел упомянуть об этом подробнее (и о методе битового сдвига), потому что считаю это "правильным" решением.

ZeroZ30o 13.08.2021 14:12

Другие вопросы по теме