0

我想从中读取一个十六进制PersistentID字符串ItunesMusicLibrary.xml,得到两个ints代表高 32 位和低 32 位,然后ints在 iTunes 脚本中使用这两个。

不幸的是,PersistentIDin 中的字符串ItunesMusicLibrary.xml似乎与PersistentIDiTunes 中的不同,可通过各种脚本接口访问

iTunes 音乐library.xml包括一个 64 位密钥,PersistentID. 例如,

<key>Persistent ID</key><string>0F1610959DA92DAB</string>.

您还可以PersistentID使用 Windows COM 接口通过脚本获取。例如,

iTunes.ITObjectPersistentIDHigh(track) -> 253104277

iTunes.ITObjectPersistentIDLow(track) -> -1649857109

如果我将这两个数字反馈到 iTunes,我会得到正确的曲目

iTunes.LibraryPlaylist.Tracks.ItemByPersistentID(253104277,-1649857109).Name

我的问题是将 xml 库中的十六进制字符串转换为高整数和低整数

例如,在 python

int('0F1610959DA92DAB'[:8], 16) -> 253104277
int('0F1610959DA92DAB'[8:], 16) -> 2645110187

第一个是正确的,第二个是不正确的。如果我将这两个值反馈回 iTunes,它就不起作用。使用其他曲目,有时两个数字都是错误的。

知道发生了什么以及如何解决它吗?

4

2 回答 2

1

您将数字解释为未签名,但 iTunes 正在使用已签名。2645110187 与 -1649857109 相同。你可能想要这样的东西:

struct.unpack('!i', binascii.a2b_hex('0F1610959DA92DAB'[8:]))[0]

...或一次获得两个值:

struct.unpack('!ii', binascii.a2b_hex('0F1610959DA92DAB'))

...它为您提供所需的元组:

(253104277, -1649857109)
于 2011-07-17T22:14:51.863 回答
0

这在 3.2 中有效,但必须有更简单的方法

pID = '0F1610959DA92DAB'
b = bytes(pID, 'utf-8')
blo = b[8:]
b2a = binascii.a2b_hex(blo)
print(int.from_bytes(b2a, byteorder='big', signed=True))
bhi = b[:8]
b2a = binascii.a2b_hex(bhi)
print(int.from_bytes(b2a, byteorder='big', signed=True))
于 2011-07-17T23:37:25.623 回答