Base64は、8ビットバイトコードを送信するためのネットワーク上で最も一般的なエンコードメソッドの1つです。詳細なMIME仕様を含むRFC2045〜RFC2049を確認できます。 base64では、3つの8ビットバイトごとに4つの6ビットバイト(3*8 = 4*6 = 24)に変換し、2つの高0sから6ビットを追加して4つの8ビットバイトを形成します。言い換えれば、変換された文字列は理論的には元の文字列よりも1/3長くなります。
php関数:base64_encode()およびbase64_decode()
base64エンコード、デコード原理
Base64エンコーディングは実際に3 8ビットバイトを4つの6ビットバイトに変換し、(3*8 = 4*6 = 24)これらの4ビットバイトは実際にはまだ8ビットですが、高等2ビットは0に設定されていますが、6ビットのみが有効である場合、その値スペースは0から6をマイナス1にマイナス1から63の電力をマイナスします。 (0〜63)。
実際、ASCIIコードには0〜63の間に多くの目に見えない文字があるため、別のマッピングを作成し、マッピングテーブルは
「'〜」z '? ASCII(0〜25)
「'〜」z '? ASCII(26〜51)
'0'〜' 9 '? ASCII(52〜61)
''? ASCII(62)
'/'? ASCII(63)
これにより、3つの8ビットバイトを4つの可視文字に変換します。
バイト分割の特定の方法は次のとおりです。(図(描かれている、精神を理解する:-))
aaaaaabb cccddddd eeffffff // abcdefは実際には1または0です。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
バイト1バイト2バイト3
||
//
00AAAAAA 00BBCCCC 00DDDEE 00FFFFFF
注:上記の3バイトビットは元のテキストで、次の4つのバイトはbase64エンコード、最初の2つのビットは0です。
このように分割するとき、元のテキストのバイト数は3の倍数である必要があります。この条件を満たすことができない場合は、すべてのゼロバイトを使用します
補完的に、変換すると、base64エンコードが=記号に置き換えられます。そのため、一部のbase64エンコーディングは1つまたは2つの等しい符号で終了します。
バンドルの理由ですが、最大2つの等しい兆候があります。なぜなら、f(origin)が元のテキストのバイト数を表す場合、f(残り)が使用される
その後、テーブルの残り
f(reming)= f(origin)mod 3が確立されています。
したがって、f(残り)の可能な値は0、1、2です。
n = [f(origin)f(reming)] / 3の場合
f(残り)= 0の場合、4*nバイトベース64エンコーディングに変換されます。
f(残り)= 1の場合、リテラルバイトを2つのbase64エンコードバイトに分割できるため、
base64エンコードを4の倍数とするため、2つの等しい標識を補充する必要があります。
f(残り)= 2の場合、2つの元のテキストバイトを3 base64エンコードされたバイトに分割できるため、同様に、
等号を追加する必要があります。
base64エンコードされた文字列の最後に0〜2の等しい符号があります。これらの等しい兆候はデコードに必要ではないため、削除できます。
ネットワークの取得および投稿パラメーターリストがリストされている場合、 '+'は正常に送信できないため、 '|'に置き換えることができます。
このように、base64によってエンコードされた文字列には「|」のみがありますおよび '/'、したがって、base64エンコードされた文字列は、パラメーター値を持つパラメーターリストとして転送できます
===========================================================================================
以下は、外国人によって書かれた実装です。
パッケージcom.meterware.httpunit;
/**********************************************************************************************************
* $ id:base64.java、v 1.4 2002/12/24 15:17:17 Russgold exp $
*
* Russell GoldによるCopyright(c)2000-2002
*
*許可は、このソフトウェアのコピーを取得している人に、無料で許可されます。
*ドキュメントファイル(「ソフトウェア」)、制限なしにソフトウェアを扱うために、これに限定されません
*ソフトウェアのコピーを使用、コピー、変更、マージ、公開、配布、sublicense、および/または販売する権利、および
*次の条件を条件として、ソフトウェアが提供される人を許可します。
*
*上記の著作権通知とこの許可通知は、すべてのコピーまたは相当部分に含まれるものとします
*ソフトウェアの。
*
*ソフトウェアは、「現状のまま」で提供され、いかなる種類の保証もありません。
*商品性、特定の目的への適合性、および非侵害の保証。いかなる場合でも
*著者または著作権所有者は、の訴訟中かどうかにかかわらず、請求、損害、またはその他の責任に対して責任を負います
*契約、不法行為、またはその他、ソフトウェアまたは使用またはその他に関連する、またはその他に関連して発生します
*ソフトウェアの取引。
*
********************************************************************************************************************************************************************つ
/**
*ベース64エンコーディングとの間で変換するユーティリティクラス。
*
* @author <a href = "mailto:[email protected]">ラッセルゴールド</a>
**/
public class base64 {final static string encodingchar = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789+/"; /***付属の文字列に相当するベース64エンコードされたエンコードされたエンコードを返します。 * @paramソースエンコードする文字列 */ public static string encode(string source){char [] sourcebytes = getPaddedBytes(source); int numgroups =(sourcebytes.length + 2) / 3; char [] TargetBytes = new char [4]; char []ターゲット= new char [4 * numgroups]; for(int group = 0; group <numgroups; group ++){convert3to4(sourcebytes、group*3、ターゲットバイト); for(int i = 0; i <targetbytes.length; i ++){ターゲット[i+4*group] = encodingchar.charat(ターゲットバイト[i]); }} int numpadbytes = sourcebytes.length -source.length(); for(int i = target.length-dumpadbytes; i <target.length; i ++)ターゲット[i] = '=';新しい文字列(ターゲット)を返します。 } private static char [] getPaddedBytes(string source){char [] converted = source.tochararray(); int requiredlength = 3 *((変換された.length+2) /3); char [] result = new char [rebyslength]; System.ArrayCopy(変換、0、結果、0、変換された.length);返品結果; } private static void convert3to4(char [] source、int sourceindex、char []ターゲット){ターゲット[0] =(char)(source [sourceindex]>>> 2);ターゲット[1] =(char)(((source [sourceindex]&0x03)<<4)|(source [sourceindex+1]>>> 4));ターゲット[2] =(char)(((source [sourceindex+1]&0x0f)<<2)|(source [sourceindex+2]>>> 6));ターゲット[3] =(char)(source [sourceindex+2]&0x3f); } /***ベース64エンコード文字列に相当するプレーンテキストを返します。 * @paramソースベース64文字列(4文字の倍数を持つ必要があります) int numgroups = source.length() / 4; int numextrabytes = source.endswith( "==")? 2:(source.endswith( "=")?1:0); byte []ターゲットバイト= new byte [3*numgroups]; byte [] sourcebytes = new byte [4]; for(int group = 0; group <numgroups; group ++){for(int i = 0; i <sourcebytes.length; i ++){sourcebytes [i] =(byte)math.max(0、encodingchar.indexof(source.charat(4*group+i)); } convert4to3(SourceBytes、TargetBytes、Group*3); }新しい文字列(ターゲットバイト、0、ターゲットバイト.length -numextrabytes)を返します。 } private static void convert4to3(byte [] source、byte [] target、int targetindex){ターゲット[ターゲットインデックス] =(byte)((source [0] <2)|(source [1] >>> 4));ターゲット[ターゲットインデックス+1] =(byte)(((source [1]&0x0f)<<4)|(source [2] >>> 2));ターゲット[ターゲットインデックス+2] =(byte)((((source [2]&0x03)<<6)|(source [3])); }}