1. TOP
  2. プログラム
  3. ソフト
  4. python
  5. バイナリデータ

バイナリデータ

バイトとバイト列

pytho3は0から255までの値を取る8ビット整数の2種類のシーケンスを導入した
bytesはイミュータブルで、バイトのタプルのようなもの
bytearrayはミュータブルで、バイトのリストのようなもの
blistというリストからスタートして、the_bytesというbytes変数と
the_byte_arrayというbytearray変数を作る
blist = [1, 2, 3, 255]
the_bytes = bytes(blist)
the_bytes
b'\x01\x02\x03\xff'
the_byte_array = bytearray(blist)
he_byte_array
bytearray(b'\x01\x02\x03\xff')
bytes値を表現するときには、bを先頭として次にクオート文字、その後に
\x02やASC||文字、最後に先頭に対応するクオート文字を置く
pythonは、16進シーケンスやASC||文字を1バイトずつ整数に変換する
有効なASC||エンコーディングにもなっているバイト値はASC||文字で
表示する。
b'\x61'
b'a'

b'\x01abc\xff'
b'\x01abc\xff'
次のコードは、どちらも0から256個の要素を持つオブジェクトを作る
the_bytes = bytes(range(0, 256))
the_byte_array = bytearray(range(0, 256))
bytes,bytearrayデータを表示するとき、`pythonは印字不能バイトについては
\xxx形式を使い。印字可能バイトについては対応するASC||文字を表示する。

structによるバイナリデータの変換

structを使うと、pythonデータ構造との間でバイナリデータを相互変換できる
pngデータろバイト形式で表示するプログラム。
import struct
valid_png_header = b'\x89PNG\r\n\xla\n'
if data[:8] == valid_png_header:
width, height = struct.unpack('>LL', data(16:24))
print('valid PNG, width', width), 'height', height
else
print('Not = vaid PNG')

dataは、PNGファイルの先頭30バイトを格納している。なおページに
おさまるようにするために、このコードはふたつのバイト列を+で継続文字
(\)を使っている
valid_png_headerには、有効なPNGファイルの先頭を示す8バイトの
シーケンスが含まれている