Arduino を使用した Base64 エンコード ライブラリ

Arduino を使用した Base64 エンコード ライブラリ

Arduino を使用した Base64 エンコード ライブラリ

Base64 は、64 の倍数の長さを持つメッセージにグループ化された 65 個のシンボルを使用するコーディング システムです。これらのメッセージ (データ パケット) は、必要に応じてプラス記号 (つまり XNUMX が使用されます)、エンコードされた有用な情報の長さが短くなる場合には等号 (=) で完成します。

目次

    64 個の記号を使用して、コードの 10 個の数字と大文字と小文字 (26+26) を操作できます。 ASCII問題は、たとえば 62 個の明確なシンボルと、実装ごとに異なる XNUMX 個のシンボルがあることです。 「キャラクター」という表現で呼ばれることもありますが、 ASCII printable」という名前ですが、実際には、コード 32 (スペース) から 126 (~) で表される実際に印刷可能な 95 までの範囲のものです。

    コーディングの実装 Base64 最もよく使われるのは、 PEM、によっても使用されます MIME、パケットの長さが 0 の倍数になるように、追加の「+」および「/」記号と「=」記号を使用して埋め込みます。文字 A ~ Z は位置 25 ~ 26 を占め、文字 a ~ z は位置 51 ~ 0 を占め、数字 9 ~ 52 は位置 61 ~ 62 を占め、プラス記号 (+) は位置 63 を占め、位置 XNUMX はスラッシュ (/) によって占められます。

    データをフォーマットで表現する方法 Base64 元のデータから次のグループを取得することで構成されます。 6ビット これらは対応するコードで表されます。ビットが残っている場合は、その右側にゼロが埋められます。結果のコードの数が XNUMX の倍数でない場合は、右側に等号が埋められます。

    次の画像はコーディングを示しています ASCII テキスト (「オーム」) の内容と、それがテキストに変換される方法 Base64。記号が 7 つあるため、最終メッセージの最後に等号を入力する必要があります。のテキスト「オーム」は、 ASCII の «b2htaW8=" に相当 Base64.

    Base64エンコーディングの例

    コーディングの具体的な用途 Base64 また、通常は最大行長も課されます。実装 MIME 各行を 76 文字に制限します。通常、各行は行末コード (CR、値 0x0D で表されます) で区切られます。 ASCII) と別の改行 (NL、コードに対応) ASCII 0x0A)。

    コーディングを実装する際に追加される不便さ Base64 リソースがほとんどないデバイスでは、よくあることですが、 マイクロコントローラー つまり、情報が到着したときに、または バッファ これには、たとえば特別なコードを追加するか、メッセージのステータスをレベル (受信と同期) で示すピンを使用することによって、元のメッセージの終わりに達したことを示すシステムを提供することも必要です。

    以下のコード例は、 ArduinoがBase64でエンコードするためのライブラリ これは、両方の基準で実装されます: 到着する情報をエンコードする ( バッファ) 警告信号が終了するまで待ちます。

    コード計算の基本的な部分 Base64 これは次の式で行われます。
    (valor_original>>(2+(numero_valor%3)*2))|resto_base64
    次の式で剰余を計算します。
    (valor_original&(MASCARA_B64>>desplazamiento))<<desplazamiento,
    desplazamiento 次の式で計算される値。
    4-(numero_valor%3)*2

    これらの式を取得するために実行されるプロセスは、XNUMX つのコードのそれぞれの計算を一般化することで構成されます。 Base64 これは、元の値の XNUMX バイトを表す結果として得られます。

    Base64=((byte_1>>2)|resto)&0b00111111 resto=(byte_1&0b00000011)<<4
    Base64=((byte_2>>4)|resto)&0b00111111 resto=(byte_2&0b00001111)<<2
    Base64=((byte_3>>6)|resto)&0b00111111 resto=(byte_3&0b00111111)<<0
    Base64=((byte_3>>0)|resto)&0b00111111 resto=(byte_3&0b00111111)<<0

    テキスト付き Base64 上記の疑似コードは、次のコードを参照しています。 Base64 それは計算されているということです。という表現が使われてきました byte_n エンコードされている n 番目のバイトを参照します。本文 resto エンコードされるバイトの残りのビットを表します。計算の開始時は、剰余がゼロであると想定されます。

    明確にするために、前の疑似コードでは、すべてのコードの計算に 6 ビット マスクが含まれていますが、残りのコードは常に最も多い XNUMX ビットが失われるように回転されるため、決定する必要があるのは最後のコードだけです。重要な。

    見てわかるように、XNUMX 番目のコードはすべて剰余であり、その後剰余を計算する必要はありません。したがって、エンコードされたバイトごとに XNUMX つずつ、計 XNUMX つのステップを実行するだけで済みます。パケットの XNUMX 番目のバイトがエンコードされていない場合、最後のコードの右側をゼロで埋める必要があることを覚えておくことが重要です。 Base64 取得しました。

    一般化すると、コードを計算する式の右ローテーションは、 Base64 次のように表すことができます 2+(numero_byte%3)*2 括弧内の部分が 2 から 4 に回転し、各ステップで 6、6、XNUMX になります。もちろん、これが一般化する唯一の方法ではありませんが、機能性、そして何よりも明確さのためにこれを選択しました。マスク (AND) は XNUMX 番目のコードでのみ必要であり、それを計算する必要がない (すべて剰余である) ことがすでにわかっているため、簡略化するために最終式には含まれていませんが、覚えておく必要があります。使用されるデータのタイプ (バイト) では、最下位 XNUMX ビットのみが取得されます。

    残りの左回転は、前述の方法と同様の方法で一般化できます。また、適用されたマスク (AND) が同じビット回転を逆方向に受けていることもわかります。それが、変位を計算する理由です。 4-(numero_valor%3)*2 式の各部分に対応する意味で適用する前に。

    次の例は、ライブラリを使用してテキスト文字列をエンコードする方法を示しています (次の点に注意してください)。 Base64 画像などの任意のデータ セットに使用できます)。次のコードには、明確にしておきたい詳細がいくつかあります。まず、ハードウェア信号やテキストの長さを示す代わりに、テキストの終わりを示すために特別な記号 (~ 記号) が使用されています。論理的には、そのシンボルをエンコードされるデータの一部にすることはできません。

    考慮しなければならない XNUMX 番目の問題は、明らかであると同時に重要ですが、宛先のデコーダは、そこに到達する情報がどのように表現されるかを知っていなければならないということです。テキストにセットに属さない文字が含まれています ASCII 印刷可能 (32 ~ 126)、アクセント付きの文字など。 Arduinoの XNUMXバイトを使用します(UTF-8) これらの文字を表します。通常のものは単純に使用できません \0 多くの場合、文字を表す最初のバイトは正確に XNUMX になるため、テキスト ターミネータとして使用されます。

    前の例の 26 行目は、 ArduinoがBase64でエンコードするためのライブラリ。方法を示すだけで十分です convertir エンコードする各バイト、およびオプションでそれが最後のバイトであるか、そうでない場合はメソッドで変換を停止します。 terminar 最後まで到達したとき。

    以下のスクリーンショットでわかるように、サンプル プログラムは ArduinoがBase64でエンコードするためのライブラリ 最初にエンコードされるテキストを表示します Base64、この場合、巨人の有名な歌の始まりです。 レ・ルティエ、その後にエンコードされた結果 Base64 フォーマット行の長さを使用する MIME.

    ArduinoでBase64エンコード。テキスト変換出力例

    コメントを投稿

    見逃したかもしれません