У меня есть один заголовочный файл 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);
}
Во-первых, вы можете сохранить значения в 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();
Преобразование каждой части в байты и последующее их объединение
(вместо <<
-все) будет работать тоже.