Wku

のjavaでbase64で文字列をエンコードする方法

それは一般的に(7ビットの伝送線路の日はほとんど終わったけれども)電子メールで送信するために写真またはオーディオをエンコードするために使用され、非表示にする方法、base64では、出力の4バイトに入力される毎に3バイト符号化する方法であるカジュアルな詮索からWebページの認証(ユーザ名とパスワード)。 ここでは、Java、マルチプラットフォームのプログラミング言語のBase64で符号器のコーディング方法の一例である。 この例では、テストコーディング列は、から借りているウィキペディアの記事

ステップ

のjavaでbase64で文字列をエンコードする方法. infoとファイル名を入力してください.
のjavaでbase64で文字列をエンコードする方法. infoとファイル名を入力してください.
  1. 1
    infoとファイル名を入力してください
  2. 2
    メモ帳やviなどのエディタを起動し、そのようなクラス宣言と呼ばれる定数として予選を入力します 。 ファイルBase64.javaという名前を付けます。
  3. 3
    これらの定数値は、関連するRFCで、ので、記事の状態を指定されています 。 それは一般的に良いアイデアは初めコーディングする前に、すべての関連するRFCを読んでいます。

  • バイトとして文字を扱うことは、日本語や中国語などのマルチバイト文字は、正しくエンコードされないことを意味します。 したがって、我々は、エンコードが開始される前に、バイトに、現​​在のロケールのUnicode文字を変換するために、getBytesメソッド()Stringのメソッドを使用する必要があります。 しかし、あなたがヨーロッパの英語ロケールで日本語の文書で作業している場合、たとえば、あなたはgetBytesメソッドの出力()のロケールを指定する必要があります、そのようなgetBytesメソッド( "UTF-8")として。
  • パディングバイトが必要とされているどのように多くの調べてみましょう。 Javaのモジュロ演算子、%が、ここで便利です。 我々はそれをしている間も、サブルーチン名とパラメータを宣言しましょう​​。
  • 今、私たちは、ヌルパッド入力にその値を使用します。 パディングが必要とされていない場合、我々は0に3を回して、3回目の係数を取るので、どれが追加されていないことに注意してください。
 公共の静的な バイト [] ZEROPAD(int の長さ、 バイト []バイト){
 バイト []パディング= 新しい バイト [長さ]; / /は、JVMによってゼロに初期化さ
 システム arraycopy(バイト、0、パッド入り、0、バイト 。);
 パッド入り復帰 ;
 }
 公共の静的な 文字エンコード 文字列 ){
 文字列エンコード= "";
 バイト [] stringArray;
 { 試す
 。stringArrayは=文字列getBytesメソッド "UTF-8"); / /適切なエンコーディング文字列を使用する!
 }( 例外は無視されます){ キャッチ
 stringArray =文字列getBytesメソッド (); / /使用するロケールのデフォルトではなくしわがれ声
 }
 int型 paddingCount =(3 - (stringArray.  %3))%3;
 stringArray = ZEROPAD(stringArray.  + paddingCount、stringArray);
  • 今、私たちは、肉を得る:コーディング列に6ビットのインデックスを抽出した後、24ビット整数に一度に3バイトを梱包。 これらの数字は魔法ではありません:24 6に正確に4回に分割し、6ビットが0から63までの値を保持することができ、その64バイトコーディング文字列内の任意の値にインデックスができます。
 {(I + = 3;、i <stringArray 長さ int型= 0) のために
 int型の J =((stringArray [I]&0xff)<< 16)+
 ((stringArray [I + 1]&0xff)<< 8)+ 
 (stringArray [I + 2]&0xff);
 エンコード=エンコード+ base64code。 キャラット ((J >> 18)&0x3F)+
 base64code。 キャラット ((J >> 12)&0x3F)+
 base64code。 キャラット ((J >> 6)&0x3F)+
 。base64code キャラット (J&0x3F);
 }
  1. 1
    最後に、私たちはわかりやすくするために別々のサブルーチンを使用して、必要な76バイト境界でのCRLFを挿入することによって、それをパディングした後、出力をパッケージ化
 リターン分割線(encoded.  (0、エンコードされた長さ () - 。paddingCount)+
 "==" 文字列 (0、paddingCount));
 }
 公共の静的な 文字列の分割線 文字列 ){
 文字列の行を= "";
 {(I + = splitLinesAt;; I <文字列の長さ ()int= 0) のために
 ライン+ =文字列。  (I、 数学 (string.  ()、I + 
 splitLinesAt));
 ライン+ = "\ r \ nを ";
 }
 行を返す ;
 }
  1. 1
    必要に応じて我々は、テストのためにメインルーチンを追加することができます 。 これは、公共の消費のために自分のコードを投稿する前に、通常は良い​​考えです。
 公共の静的な 無効メイン 文字列 [] args){
 するfor(int i = 0のとき;。I <args長さ、i + +){
 システムが 誤るのprintln( "エンコーディング\" "+ argsは[i]+" \ "");
 システム のうちのprintln((引数[i])コードする);
 }
 }
  1. 1
    ここで完成したモジュールは、次のとおりです。
 パブリッククラス Base64の{
 
 プライベート静的な最終的な 文字列 base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789" + "+ /";
 
 プライベート静的な最終的な int型 splitLinesAt = 76;
 
 公共の静的な バイト [] ZEROPAD(int の長さ、 バイト []バイト){
 バイト []パディング= 新しい バイト [長さ]; / /は、JVMによってゼロに初期化さ
 システム arraycopy(バイト、0、パッド入り、0、バイト 。);
 パッド入り復帰 ;
 }
 
 公共の静的な 文字エンコード 文字列 ){
 
 文字列エンコード= "";
 バイト [] stringArray;
 { 試す
 。stringArrayは=文字列getBytesメソッド "UTF-8"); / /適切なエンコーディング文字列を使用する!
 }( 例外は無視されます){ キャッチ
 stringArray =文字列getBytesメソッド (); / /使用するロケールのデフォルトではなくしわがれ声
 }
 / /出力に追加する方法を多くのパディングバイト決定
 int型 paddingCount =(3 - (stringArray.  %3))%3;
 / /入力に必要なパディングを追加
 stringArray = ZEROPAD(stringArray.  + paddingCount、stringArray);
 時/ /プロセス3バイト、4出力バイトを乱発
 / /後でCRLFの挿入を心配
 {(I + = 3;、i <stringArray 長さ int型= 0) のために
 int型の J =((stringArray [I]&0xff)<< 16)+
 ((stringArray [I + 1]&0xff)<< 8)+ 
 (stringArray [I + 2]&0xff);
 エンコード=エンコード+ base64code。 キャラット ((J >> 18)&0x3F)+
 base64code。 キャラット ((J >> 12)&0x3F)+
 base64code。 キャラット ((J >> 6)&0x3F)+
 。base64code キャラット (J&0x3F);
 }
 / / "="でエンコードされたパディングNULLを置 ​​き換える
 リターン分割線(encoded.  (0、エンコードされた長さ () -
 paddingCount)+ "==" 文字列 (0、paddingCount));
 
 }
 公共の静的な 文字列の分割線 文字列 ){
 
 文字列の行を= "";
 {(I + = splitLinesAt;; I <文字列の長さ ()int= 0) のために
 
 ライン+ =文字列文字列 (I、 数学  (string.  ()、I + splitLinesAt));
 ライン+ = "\ r \ nを ";
 
 }
 行を返す ;
 
 }
 公共の静的な 無効メイン 文字列 [] args){
 
 するfor(int i = 0のとき;。I <args長さ、i + +){
 
 システムが 誤るのprintln( "エンコーディング\" "+ argsは[i]+" \ "");
 システム のうちのprintln((引数[i])コードする);
 
 }
 
 }
 
 }
  1. 1
    :Wikipediaの記事からホッブズの引用を使用して、テスト、javacは、GCJ、Jikesは、等を用いて、それをコンパイルしてみましょう

ここではその結果は次のとおりです。


  1. 1
    それは正確に一致する ! それはどちらか、両方のプログラムが間違っていることを意味し、またはそれらは多かれ少なかれ右両方です。 この時点で、Wikipediaの記事を再訪したいと我々は何かを逃したかどうかを確認するためにリンクされているRFCを読むかもしれない。

ヒント

  • このモジュールのコンパニオン·デコード()メソッドを書いてみてください!
  • あなたが理解によると、時々の最善の方法は、それらをすくい取ることですコード、その後戻って、RFCの必須に対する機能性のポイントバイポイントをチェックして、該当するRFCを読むのは、量産コードのために必要ですが、情報過多は、圧倒的なことができ要件。
  • Javaは汎用言語として大丈夫ですし、携帯電話のようなデバイスのために、プログラマの唯一の選択肢かもしれません、しかし、あなたはJavascriptのか、Pythonの構文はより簡潔で強力なことを見つけるかもしれません。 異なる言語は独自の長所と短所を持っている。
  • あなたはいつもコーディング前に完全に何かを理解するために持っていることを感じることはありません。 あなたに沿って行くと物事は明確に得る。

関連記事