アイテム インデックス |
---|
プログラマーの Python データ – バイトと文字列 |
文字列としてのバイト |
1/2 ページ
バイトと文字列の間には密接ではあるが複雑な関係があります。 私の新しい本からのこの抜粋で、すべてがどのように機能するかを調べてください プログラマーの Python: すべてはデータです.
プログラマーの Python
すべてがデータ
印刷本として入手可能になりました:Amazon
コンテンツ
- Python – ライトニング ツアー
- 基本的なデータ型 – 数値
抽出: ビッグナム - 真実と偽り
- 日時
- シーケンス、リスト、タプル
- 皮ひも
- 正規表現
- 辞書
- イテラブル、セット、ジェネレーター
- 理解
理解の抽出 - データ構造とコレクション
- ビットとビット処理
- バイト
バイトと文字列を抽出する ***新着!!! - バイナリ ファイル
- テキストファイル
- カスタム データ クラスの作成
- Python とネイティブ コード
付録 I Visual Studio Code での Python
付録 II Visual Studio Code を使用した C プログラミング
ここで、ビットをグループ化してバイトを形成する方法を検討します。 Python は、その bignum データ型を使用して任意の長さのビット パターンを表現できるという点で珍しいものです。 他のほとんどの言語は、複数の小さな単位 (ほとんどの場合、バイト、つまり 8 ビット) を使用して、より大きなビット パターンを構築する必要があります。 Python には、バイトを操作するために使用できるさまざまなデータ オブジェクトがあります。幸いなことに、大部分はシーケンスであり、予想よりも洗練されています。
バイトと文字列の観点から機能するオブジェクト間にも強い関係があります。 特に、この章では、エンコーディングを理解し、ASCII で機能するレガシー プロトコルを処理する方法を学びます。
バイト処理の 2 つ目の側面は、他のプログラムやデバイスが Python プログラムに公開する可能性のある生のバッファーを処理することです。 ここで、memoryview が真価を発揮します。
バイトとバイト配列
bytearray は、バイトである要素の変更可能なシーケンスです。 bytes オブジェクトは、その不変の対応物です。 どちらも、不変のバイト オブジェクトを変更しようとする操作を除いて、ほとんど同じように機能します。
bytes と bytearray が機能する方法は、ASCII テキストの時代にどのように機能していたかによってほとんど決まります。 プログラミング言語では、文字列を使用してバイト値の配列を提供するのが一般的でした。 文字列内の各拡張 ASCII 文字は、0 ~ 255 の値、つまり 1 バイトをコード化するために使用されました。
たとえば、文字列 “Hello World” の ASCII 表現は次のとおりです。
[‘0x48’, ‘0x65’, ‘0x6c’, ‘0x6c’, ‘0x6f’, ‘0x20’, ‘0x57’, ‘0x6f’,
‘0x72’, ‘0x6c’, ‘0x64’]
他の言語では、この文字列はバイト配列であるかのように使用されます。 Python では、文字列は UTF-8 を使用して格納されるため、1 文字を 1 バイトにする単純さが失われ、文字列をバイト配列として使用することが困難になります。 Python オブジェクトの bytes と bytearray は基本的に ASCII 文字列を実装しているため、それらをバイトの配列であるかのように引き続き使用できます。
これは、基本的に文字列リテラルの先頭に ab を追加し、使用できる文字を ASCII エンコーディングに制限するバイト リテラルの形式を説明しています。 たとえば、Hello World のバイト リテラルは次のとおりです。
myBytes = b"Hello World"
これにより、文字列 Hello World 内の各文字の ASCII コードによって決定されるバイトに初期化されたバイト オブジェクトが作成されます。 厳密な ASCII 文字への制限は、指定できる最大値が 127 であることを意味します。これより大きい値を指定する場合は、エスケープ コードを使用する必要があり、bytes は文字列と同じセットをサポートします。 特に関連するものは次のとおりです。
ooo 8 進値 OOO を持つ文字
xhh 16 進値 hh を持つ文字
これらにより、127 を超えることができます。たとえば、
myBytes = b”xFFxFF”
各要素に 255 が格納された myBytes オブジェクトを作成します。
初期化されたバイトまたはバイト配列オブジェクトを作成するには、リテラル バイト以外の方法があります。 どちらの場合も、コンストラクターを使用して、適切なイテレーターをバイトまたはバイト配列オブジェクトに変換できます。 形式は次のとおりです。
b = bytes(source) b = bytearray(source)
どこ ソース 反復可能です。 もちろん、各要素は 0 から 255 でなければならないため、これはソースからも true でなければなりません。 たとえば、バイト([0xFF,0xAA,0x55]) は、リストに示されている要素を持つ 3 要素のバイト オブジェクトを作成します。 別の方法として、文字列を使用して 16 進値を指定できる fromhex クラス メソッドを使用できます。
bytesarray.fromhex(“FF AA 55”)
ASCII に慣れていない場合、または必要なバイト シーケンスが数値として指定されている場合、これらはバイトとバイト配列を作成するより直接的な方法です。 ただし、ASCII 文字列とバイト配列の関係を完全に回避することはできません。 bytes または bytearray オブジェクトを出力する場合、hh として出力される 127 より大きい要素を除いて、ASCII 文字列として出力されます。hh は 16 進記号です。 同様に、印刷できない ASCII 文字はエスケープ シーケンスとして表示されます。 これは混乱を招く可能性があります。 例えば:
print(バイト([0xFF,0xAA,0x55])))
表示:
b’xffxaaU’
エスケープ コードの長いシーケンスに埋め込まれた ASCII 文字を見逃すのは非常に簡単です。
バイトを 16 進数で表示したい場合 (16 進数に満足している場合は読みやすい)、16 進数値の文字列を返す 16 進数クラス メソッドを使用できます。
print(bytes([0xFF,0xAA,0x55]).hex())
表示:
ffaa55
これにはエスケープ コードはありませんが、バイトは区切られません。 16 進数メソッドの 2 つのパラメーターを使用して、区切り文字とグループ化する 16 進数の数を指定できます。 例えば:
print(bytes([0xFF,0xAA,0x55]).hex(","))
表示:
ff,aa,55
または、リストに変換して、必要に応じて結果をフォーマットすることもできます。
以下を使用して、初期化されていないバイト配列を作成できることに注意してください。
b = bytearray(n)
ここで、n は要素数を指定します。
.