libimobiledevice 返回奇怪的字符
libimobiledevice returning weird characters
我正在尝试与连接的 iOS 设备配对并使用 libimobiledevice 和 JNA 获取 UDID。这就是我声明本机函数的方式:
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
每次的人物都不一样
万一你看不到:
UUID 每次都不同,因为它是唯一的!每个新生成的都不一样。
至于奇怪的字符,您将 uuid
(以及 type
)映射到 StringByReference
是罪魁祸首,因为您没有在其本地存储的格式。
C 中的方法签名(您应该将其与您的问题一起发布)指出 uuid
的类型是 **char
,一个指向 8 位 C 字符串的指针值。深入研究源代码,它们似乎是字符串表示形式中的数字 0-9 和 A-F,以及 32 字节(没有连字符)或 36 字节(有)加上空终止符。 (请注意,这并不总是很明显;它们可以作为完整字节值存储在 16 个字节中,API 实际上应该记录下来。)
在内部,StringByReference
class 使用 Pointer.getString()
方法:
public String getValue() {
return getPointer().getString(0);
}
只有一个偏移量的getString() method使用您平台的默认编码,这可能是一个多字节字符集。这可能与 UUID 的 8 位编码不匹配(在您的情况下显然不匹配)。
您应该将 UUID 映射为 PointerByReference
并使用 uuid.getValue().getString(0, "UTF-8")
或 uuid.getValue().getString(0, "US-ASCII")
获取字符串作为它们所代表的 8 位字符。
(或者,您可以获取一个字节数组并从中创建一个字符串,但我不确定您是否会获得 32 字节或 36 字节的结果,所以如果您采用这种方法,请玩得开心。为了真正有趣,您可以迭代偏移量并逐字节读取,直到得到 0。但我离题了。)
对 type
字段做同样的事情留作 reader 的练习。
我正在尝试与连接的 iOS 设备配对并使用 libimobiledevice 和 JNA 获取 UDID。这就是我声明本机函数的方式:
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
每次的人物都不一样
万一你看不到:
UUID 每次都不同,因为它是唯一的!每个新生成的都不一样。
至于奇怪的字符,您将 uuid
(以及 type
)映射到 StringByReference
是罪魁祸首,因为您没有在其本地存储的格式。
C 中的方法签名(您应该将其与您的问题一起发布)指出 uuid
的类型是 **char
,一个指向 8 位 C 字符串的指针值。深入研究源代码,它们似乎是字符串表示形式中的数字 0-9 和 A-F,以及 32 字节(没有连字符)或 36 字节(有)加上空终止符。 (请注意,这并不总是很明显;它们可以作为完整字节值存储在 16 个字节中,API 实际上应该记录下来。)
在内部,StringByReference
class 使用 Pointer.getString()
方法:
public String getValue() {
return getPointer().getString(0);
}
只有一个偏移量的getString() method使用您平台的默认编码,这可能是一个多字节字符集。这可能与 UUID 的 8 位编码不匹配(在您的情况下显然不匹配)。
您应该将 UUID 映射为 PointerByReference
并使用 uuid.getValue().getString(0, "UTF-8")
或 uuid.getValue().getString(0, "US-ASCII")
获取字符串作为它们所代表的 8 位字符。
(或者,您可以获取一个字节数组并从中创建一个字符串,但我不确定您是否会获得 32 字节或 36 字节的结果,所以如果您采用这种方法,请玩得开心。为了真正有趣,您可以迭代偏移量并逐字节读取,直到得到 0。但我离题了。)
对 type
字段做同样的事情留作 reader 的练习。