2011-07-17 16 views
0

ItunesMusicLibrary.xmlから16進数のPersistentID文字列を読み込み、上位32ビットを表す2つのintを取得し、iTunesスクリプトでこれら2つの整数を使用したい。さまざまなスクリプト・インターフェースを介してアクセス可能なitunes永続的なid - 音楽ライブラリxmlバージョンとiTunesの16進数バージョン

iTunesミュージックlibrary.xmlは、64ビットキー、永続IDを含んでいるよう

残念ながら、ItunesMusicLibrary.xmlで永続的なID列は、iTunesでだ同じ永続IDではないようです。たとえば、

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

WindowsのCOMインターフェイスを使用してスクリプトを使用してPersistentIDを取得することもできます。私はiTunesに戻って、これらの2つの数値を養う場合たとえば、

iTunes.ITObjectPersistentIDHigh(track) -> 253104277 

iTunes.ITObjectPersistentIDLow(track) -> -1649857109 

は、私は私の問題は、ハイとローの整数

にXMLライブラリからの16進文字列を翻訳され

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

正しいトラックを取得します例えば

は、パイソン

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

に最初は第二ではない、正確です。私が2つの値をiTunesに戻すと、うまくいきません。他のトラックを使用すると、両方の番号が間違っていることがあります。

何が起こっているのか、それを修正する方法はありますか?

答えて

1

あなたは数字を署名なしと解釈していますが、iTunesは署名付きです。 2645110187は-1649857109と同じです。あなたはこのようなものをお勧めします:

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

を...または一度に両方の値を取得する:

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

...あなたが必要タプル与える:

(253104277, -1649857109) 
+0

私はTyp eError: 'str'はバッファインタフェースをサポートしていません – foosion

+0

おそらく私がPython 3.2にいるため – foosion

+0

これは2.7ではなく3.2で動作します。 – foosion

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)) 
+0

参照http://stackoverflow.com/questions/6727875/hex-string-to-signed-int-in-python- 3-2/6727975 – foosion

関連する問題