Lunatic Sol

IT Tips

struct モジュール : pack と unpack

2009-05-08 10:41:10 | Python
たいてい、ファイルの先頭 n バイトはファイルを識別するための情報に使われていたりします。C 言語でいうところの構造体を使って、最初の4バイト (DWORD) にてファイル種別、次の4バイト (DWORD) にて○○というようなものでしょうか。

これが固定長であればいいのですが、x バイト目にサイズが書いてあって、そのサイズ分を先頭に確保したりしているような場合がありますが、そのような場合細かく分析する必要があります。

Python で、そのような情報を取得する必要があったのですが、以下の情報がそのものでした。struct モジュール (まさに C言語の構造体 - structure をモジュール名にしていますね) の unpack / pack を使うのがこれになります。

http://d.hatena.ne.jp/fgshun/20080524/1211623204

node.nodeType

2009-05-08 10:35:42 | XML
最近 XML (DOM) を python でいじってますが、例えば

if node.nodeType == node.TEXT_NODE:


としたときの node.nodeType のリストがわからなかったりします。

まとまったものを見つけたのでメモ

https://developer.mozilla.org/En/DOM/Node.nodeType


node.ELEMENT_NODE == 1
node.ATTRIBUTE_NODE == 2
node.TEXT_NODE == 3
node.CDATA_SECTION_NODE == 4
node.ENTITY_REFERENCE_NODE == 5
node.ENTITY_NODE == 6
node.PROCESSING_INSTRUCTION_NODE == 7
node.COMMENT_NODE == 8
node.DOCUMENT_NODE == 9
node.DOCUMENT_TYPE_NODE == 10
node.DOCUMENT_FRAGMENT_NODE == 11
node.NOTATION_NODE == 12

InfoPath の添付ファイル

2009-05-08 02:28:25 | Windows
InfoPath は XML ファイルですが、添付ファイルを扱うことができます。この添付ファイル、XML を見てみると Base64 なのかなということが伺えますが、なぜか先頭の数バイトが同じになります。

なぜかなと思ってたら、以下のことがわかりました。

http://support.microsoft.com/kb/892730/en-us

[  A  ][  B  ][  C  ][  D  ]
[  E  ][  F  ][  G     .....
.............][N][N]


A - 4byte - InfoPath Signature 0xC7 0x49 0x46 0x41
B - 4byte - Size 0x14
C - 4byte - Version 0x01
D - 4byte - Reserved 0x00
E - 4byte - ファイルサイズ
F - 4byte - ファイル名サイズ
G - 可変長 - ファイル名 (Unicode)
N - 1byte - Null (x2)

要は、これらのデータがファイルの先頭に結合された上で Base64Encode されていたということです。

戻したければ、Base64Decode した上で、上の情報を削除してあげればオリジナルのバイナリデータにする必要があるということですね。