Как построить один байтовый массив, который будет иметь несколько значений типов данных в нем?

У меня есть один заголовочный файл client_address.h в C ++, в котором я имею ниже объявлений —

typedef uint64_t   CustomerAddress;

void client_data(uint8_t datacenter,
uint16_t client_id,
uint8_t data_id,
uint32_t data_counter,
CustomerAddress& customer_address);

А потом в моем файле реализации client_address.cpp У меня есть реализация client_data Метод — Так что он принимает пару переменных в качестве параметров, а затем сделать одну окончательную переменную customer_address из этого, который uint64_t

void client_data(uint8_t datacenter,
uint16_t client_id,
uint8_t data_id,
uint32_t data_counter,
CustomerAddress& customer_address)
{
customer_address = (uint64_t(datacenter) << 56)
+ (uint64_t(client_id) << 40)
+ (uint64_t(data_id) << 32)
+ data_counter;
}

Мне нужно сделать то же самое в Java, с помощью которого у меня будет одна переменная, которая будет customer_address и это будет uint64_t в Java (который, я думаю, Ineteger), а затем он будет состоять из datacenter, client_id, data_id, data_counter и они также должны иметь тот же тип данных в Java, как показано выше в c ++.

В Java я хотел бы сделать один окончательный байтовый массив customer_address который будет uint64_t и будет состоять из datacenter, client_id, data_id, data_counter с тем же типом данных в Java. Как бы я это сделал?

Любой простой пример поможет мне лучше понять.

Обновить

Мой метод ниже выглядит правильно?

long client_data(byte datacenter, short client_id, byte data_id, int data_counter) {
return ((long) (datacenter) << 56) | ((long) client_id << 40) | ((long) data_id << 32) | ((long) data_counter);
}

2

Решение

Во-первых, вы можете сохранить значения в Long похоже, как вы делаете это в C / C ++
Но обратите внимание на подпись Javas; + может дать другие результаты, чем двоичный файл или |
То есть. что-то подобное с Longе годы:

customer_address = (datacenter << 56)
| (client_id << 40)
| (data_id << 32)
| data_counter;

Конечно, вы также можете приводить переменные здесь, как в C / C ++
(если они уже не длинные).
Функция, как в вашем вопросе может выглядеть так (но с возвращаемым значением
вместо ссылки, потому что это боль в Java для примитивных типов):

long client_data(byte datacenter,
short client_id,
byte data_id,
int data_counter)
{
return ((long(datacenter) << 56)
| (long(client_id) << 40)
| (long(data_id) << 32)
| long(data_counter));
}

Затем вы можете получить байтовый массив следующим образом:

ByteBuffer b = ByteBuffer.allocate(8);
b.order(ByteOrder.BIG_ENDIAN);
b.putLong(blablavariable);
byte[] result = b.array();

Преобразование каждой части в байты и последующее их объединение
(вместо <<-все) будет работать тоже.

2

Другие решения


По вопросам рекламы [email protected]