Как я могу объявить массив uint8_t в Java - PullRequest
0 голосов
/ 30 января 2019

В моей DLL есть функция C ++, которой в качестве входного параметра нужен массив uint8_t, поэтому массив выглядит примерно так:

uint8_t input[input_length] = { 0x30, 0x41, 0x80, 0x8A...}; 

Я хочу использовать эту функцию в Java с JNA, котораяозначает, что я должен создать массив uint8_t в Java.Моим первым подходом было создание байтового массива, например:

byte[] input = { 0x30, 0x41, 0x80, 0x8A...}; 

Но потом я понял, что переменная uint8_t в C ++ имеет диапазон от 0..255, но байтовая переменная в Java имеет диапазон от -128..127, и, как вы можете видеть, этот массив содержит значения, превышающие 127 (например, 0x8A), что означает, что мое объявление Java здесь недопустимо.Поэтому мой вопрос в том, какой тип в Java эквивалентен uint8_t?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Значение, хранящееся в байте, является определенным независимо от того, как вы его интерпретируете, знаковое или беззнаковое, что имеет значение.

Это легко проверить с помощью следующего кода:

byte test = (byte)255;
System.out.println(test & 0xFF);

, которыйвыводит 255.

Это означает, что после того, как вы создали byte[] с нужными вам значениями (и приведение каждого значения к байту позволяет вам устанавливать значения без знака).Тогда вы в порядке, со своей стороны JNI вы будете использовать:

jbyte* data = GetByteArrayElements(...)

, и вы сможете использовать его как массив беззнаковых байтов, напрямую приведя его при необходимости (uint8_t*)data.

0 голосов
/ 30 января 2019

Java не имеет неподписанных типов.Но это не большая проблема, поскольку переполнение со знаком в Java определяется как дополнение к двум, вы можете просто передать byte туда, где JNA ожидает uint8_t.Работать с ним немного неудобно:

byte[] input = { 0x30, 0x41, (byte)0x80, (byte)0x8A...};

Чтобы прочитать uint8_t назад, вы должны сделать (x & 0xFF), чтобы убрать расширение знака и работать с результатом как int.

...