Pythonの「単語」のバイト数を知る必要があります。これが必要な理由は、ファイルから読み取る必要のある単語の数があるからです。単語のバイト数がわかれば、このfile.read(num_bytes)
関数を使ってファイルから適切な量を読み取ることができます。
ワードのバイト数を確認するにはどうすればよいですか?
platform.architecture
次の機能を使用できます。
>>> import platform
>>> platform.architecture()
('64bit', '')
同じページのメモに注意してください。
注MacOSX(およびおそらく他のプラットフォーム)では、実行可能ファイルは複数のアーキテクチャを含むユニバーサルファイルである場合があります。現在のインタープリターの「64ビットネス」を取得するには、sys.maxsize属性を照会する方が信頼性が高くなります。
is_64bits = sys.maxsize > 2**32
これにより、Pythonインタープリターがコンパイルされたワードサイズが得られることに注意してください。Pythonが32ビットモードでコンパイルされている場合、64ビットホストで32の値を取得できます。
ファイルが別の実行可能ファイルによって生成され、この実行可能ファイルにアクセスできる場合は、platform.architecture
関数の最初のオプションの引数を使用できます。
>>> p.architecture('/path/to/executable')
('32bit', '')
Pythonには「word」の概念はありません。ファイルからバイナリデータを読み取るときに、一度に読み取る必要のあるバイト数を明示的に指定できます。
コンパイラやプラットフォームの観点から、「WORD」は通常、基本データユニットのサイズを決定します。そしてPythonはそのようなものから独立しています:)
単語が何であるかについての本当に正しい定義はありません。特定のアーキテクチャがいくつかのバイト数の「ワード」を呼び出すことを除いて(x86は1ワードを2バイトと呼び、PPCは1ワードを4バイトと呼びます)、この任意の値以外にあまり意味はありません。
おそらく最も簡単な解決策は、struct
モジュールに従うことです。たとえば、フォーマット'h'
は短い署名を意味します(これは「単語」のインテルの定義と合理的に一致します)。だからあなたはこれを行うことができます:
>>> import struct
>>> f = file('.vimrc')
>>> struct.unpack('h', f.read(struct.calcsize('h')))
(8226,)
>>>
Pythonの「単語」のバイト数を知る必要があります。これが必要な理由は、ファイルから読み取る必要のある単語の数があるからです。
次に、ファイルを書いた人に尋ねる必要があります。Pythonとは何の関係もなく、実際のファイル形式とは何の関係もありません。ところで、ファイルが単語のシーケンスとして定義されるのはかなり奇妙です。これはおそらく16ビットまたは32ビットの整数のシーケンスであるか、実際にはテキストの意味での単語です。この場合、区切り文字が何であれ、実際にファイルをスキャンしてトークンを探します。
このようなものはどうですか:
def machine_word_size():
import sys
num_bytes = 0
maxint = sys.maxint
while maxint > 0:
maxint = maxint >> 8
num_bytes += 1
return num_bytes
おそらく、次のことが適切で役立つ可能性があります。32ビットをチェックするとします。(-1)<<31が長く戻ってくるかどうかを確認します。32ビットの場合はそうではありませんが、(-1)<<32および1<<31はそうです。