【问题标题】:libimobiledevice returning weird characterslibimobiledevice 返回奇怪的字符
【发布时间】:2019-07-05 17:23:25
【问题描述】:

我正在尝试与已连接的 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

角色每次都不一样。

如果你看不到它:

【问题讨论】:

  • 你为什么用 C 标记这个?
  • @Bwebb 因为 libimobiledevice 是用 C 语言制作的
  • 好的,我不确定这有多大意义,但查看你的 java printfs 看起来就像你在打印随机内存。 "udid: " + udid.getValue()" 作为 println arg 传递,但我看不到 udid 值的设置位置。该内存应该分配到哪里?
  • @Bwebb 应该分配在idevice_get_udid()

标签: java c jna libimobiledevice


【解决方案1】:

UUID 每次都会改变,因为它是独一无二的!每个新生成的都是不同的。

至于奇怪的字符,您将uuid(以及type)映射到StringByReference 是罪魁祸首,因为您没有以本机存储的格式获取数据。

C 中的方法签名(您应该在您的问题中发布)指出 uuid 的类型是 **char,它是一个指向 8 位 C 值字符串的指针的指针。深入研究源代码,它们似乎是字符串表示中的数字 0-9 和 A-F,以及 32 个字节(不带连字符)或 36 个字节(带)加上空终止符。 (请注意,这并不总是显而易见的;它们可以存储在 16 个字节中作为完整字节值,API 应该实际记录的内容。)

在内部,StringByReference 类使用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 字段做同样的事情留给读者作为练习。

【讨论】:

  • 非常感谢!我花了很长时间试图让它发挥作用(我希望我能多次投票给你)
猜你喜欢
  • 2017-07-04
  • 2018-03-11
  • 2019-07-27
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 2019-11-14
相关资源
最近更新 更多