我想从ItunesMusicLibrary.xml读取一个十六进制PersistentID字符串,得到两个代表高和低32位的整数,然后在iTunes脚本中使用这两个整数。
不幸的是,ItunesMusicLibrary.xml中的Persistent ID字符串似乎与itunes中的Persistent ID不同,可以通过各种脚本接口访问
itunes music library.xml包含64位密钥Persistent ID。例如,<key>Persistent ID</key><string>0F1610959DA92DAB</string>.
您还可以使用Windows COM界面通过脚本获取PersistentID。例如,
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,则无效。使用其他曲目,有时两个数字都是错误的。
知道发生了什么以及如何解决这个问题?
答案 0 :(得分:1)
您将数字解释为未签名但iTunes正在使用签名。 2645110187与-1649857109相同。你可能想要这样的东西:
struct.unpack('!i', binascii.a2b_hex('0F1610959DA92DAB'[8:]))[0]
...或者同时获取两个值:
struct.unpack('!ii', binascii.a2b_hex('0F1610959DA92DAB'))
...它为您提供了所需的元组:
(253104277, -1649857109)
答案 1 :(得分: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))