libimobiledevice возвращает странные символы - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь установить соединение с подключенным устройством iOS и получить UDID с помощью libimobiledevice и JNA.Вот как я объявил собственные функции:

static native int idevice_new(PointerByReference device, Pointer udid);
static native int lockdownd_client_new(Pointer device, PointerByReference client, String label);
static native int idevice_get_udid(Pointer idevice, StringByReference udid);
static native int lockdownd_query_type(Pointer lockdownd_client, StringByReference type);

Для тестирования я пытаюсь сделать именно то, что выполняет команда idevicepair pair.

Это мой основной метод:

PointerByReference device = new PointerByReference();
System.out.println("idevice_new error code: " + idevice_new(device, Pointer.NULL));
PointerByReference client = new PointerByReference();
System.out.println("lockdownd_client_new error code: " + lockdownd_client_new(device.getValue(), client, "java"));
StringByReference udid = new StringByReference();
System.out.println("idevice_get_udid error code: " + idevice_get_udid(device.getValue(), udid));
System.out.println("udid: " + udid.getValue());
StringByReference type = new StringByReference();
System.out.println("lockdownd_query_type error code: " + lockdownd_query_type(client.getValue(), type));
System.out.println("lockdownd_query_type: " + type.getValue());
System.out.println("lockdownd_pair error code: " + lockdownd_pair(client.getValue(), Pointer.NULL));

Всякий раз, когда я пытаюсь получить какое-либо строковое значение, он выводит следующие странные знаки вопроса:

idevice_new error code: 0
lockdownd_client_new error code: 0
idevice_get_udid error code: 0
udid: ��AZ�
lockdownd_query_type error code: 0
lockdownd_query_type: �HbZ�
lockdownd_pair error code: 0

Символы каждый раз разные.

В случаеВы не можете видеть это:

program output

1 Ответ

0 голосов
/ 13 февраля 2019

UUID меняется каждый раз, потому что он уникален!Каждый новый сгенерированный отличается.

Что касается странных символов, то ваше отображение uuid (а также type) в StringByReference является виновником, так как вы не получаете данныев формате, в котором он хранится в исходном формате.

Подпись метода в C (которую вы должны были опубликовать со своим вопросом) отмечает, что тип uuid равен **char, Указатель на указатель на строку8-битных значений C.Копаясь в исходном коде, кажется, что они представляют собой цифры 0-9 и AF в строковом представлении, и либо 32 байта (без дефисов), либо 36 байтов (с) плюс нулевой терминатор.(Обратите внимание, что это не всегда очевидно; они могли бы быть сохранены в 16 байтах как полное значение байта, что API должен фактически задокументировать.)

Внутри класса StringByReference используется метод Pointer.getString():

public String getValue() {
    return getPointer().getString(0);
}

Метод getString () только со смещением использует кодировку по умолчанию вашей платформы, которая, вероятно, является многобайтовым набором символов.Это может не соответствовать (и, очевидно, в вашем случае) не соответствует 8-битной кодировке UUID.

Вы должны отобразить UUID как PointerByReference и использовать uuid.getValue().getString(0, "UTF-8") или uuid.getValue().getString(0, "US-ASCII") дляполучить строку как 8-битные символы, которые они представляют.

(С другой стороны, вы можете получить байтовый массив и создать из него строку, хотя я не уверен, что вы получите 32- или 36-байтовый результат, так что получайте удовольствие, если вы пойдете по этому путиДля истинного удовольствия вы можете перебирать смещение и читать побайтово до тех пор, пока не получите 0. Но я отвлекся.)

То же самое для поля type оставлено в качестве упражнения длячитатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...