apache commons ソースリーディングの会:codec
DESCRIPTION
TRANSCRIPT
Apache Commonsソースリーディングの会
本日のお題
Apache Commonsのライブラリ群のうちネット上でデータのやり取りを行う際に多く用いられる「符号化」関連の処理をつかさどる「Codec」を今日は取り上げます。
※符号化とは?→データを、後で復元可能な形で変換を加えること(encode)。また変換を加えられたデータを元に戻す事(decode)
前提:なぜ符号化が必要?
以下のような用途が考えられる。(他にもあるかもしれません)•暗号化•圧縮•データの標準化文字コードや、動画・音声形式等々
•データのポータビリティダブルバイトの文字列をシングルバイトでも表現できるように変換する(ex.Base64)ことで多くのソフトがそのまま使用できる、など
アジェンダ
✓Commons Codecについて概説✓org.apache.commons.codec✓org.apache.commons.codec.binary✓org.apache.commons.codec.digest✓org.apache.commons.codec.language✓org.apache.commons.codec.net✓まとめ
Commons Codec
http://commons.apache.org/codec/
2009年8月に1.4がリリース(実に約5年ぶりのVer.UP!)Java1.4以上で動作
パッケージ構成
• org.apache.commons.codec.binary- バイナリ処理関連のエンコーダー- Base64 / Hex / Binary Codec
• org.apache.commons.codec.digest- MD5やSHA1の符号化補助
• org.apache.commons.codec.language- 主に英語の言語処理の際に用いられる符号化- Soundex / Metaphone
• org.apache.commons.codec.net- インターネット上で使用される符号化- URLCodec(URL Encode) / Quoted Printable Codec /
BCodec / QCodec
アジェンダ
✓Commons Codecについて概説✓org.apache.commons.codec✓org.apache.commons.codec.binary✓org.apache.commons.codec.digest✓org.apache.commons.codec.language✓org.apache.commons.codec.net✓まとめ
org.apache.commons.codec
• 後述する各種パッケージのルート(親玉)になるもの。
• インターフェースの定義、ならびにExceptionの定義がされている。- Encoder / Decoder
- BinaryEncoder / BinaryDecoder- StringEncoder / StringDecoder
- StringEncoderComparator- DecoderException / EncoderException- CharEncoding(charset名を定数で管理)
アジェンダ
✓Commons Codecについて概説✓org.apache.commons.codec✓org.apache.commons.codec.binary✓org.apache.commons.codec.digest✓org.apache.commons.codec.language✓org.apache.commons.codec.net✓まとめ
org.apache.commons.codec.binary
• バイナリ関連のエンコード/デコード- BinaryEncoder / BinaryDecoder
- Base64- Base64InputStream / Base64OutputStream
- Hex- BinaryCodec
- StringUtils
Base64
• 64種の印字可能な英数字を用いてデータを符号化する。
• 電子メール、Basic認証などで使用• データサイズは、元データの4/3程度になる。
Base64 Encoding
• エンコードテーブルを用いて符号化• 一般的には[0-9a-zA-Z+/]• Commons Codec実装では二つのテーブルが用意されている。• STANDARD_ENCODE_TABLE
• [0-9a-zA-Z+/]• URL_SAFE_ENCODE_TABLE
• [0-9a-zA-Z-_]• RFCに準拠した実装
http://www.ietf.org/rfc/rfc2045.txt
コンストラクタ
• 無指定• urlSafe:boolean• lineLength:int• lineLength:int, lineSeparator:byte[]• lineLength:int, lineSeparator:byte[],
urlSafe:boolean
• lineLength• 改行を行うバイト数の指定
• デフォルト:76(バイト)• RFC2045 section 6.8.に規定
http://tools.ietf.org/html/rfc2045#section-6.8
コンストラクタ
• lineSeparator• 改行文字
• デフォルト:CRLF(\r\n)• RFC2045 section 2.1.に規定
http://tools.ietf.org/html/rfc2045#section-2.1mailのRFC(RF822)とも関連
コンストラクタ
• urlSafe• 使用するエンコーディングテーブルを選択
• true:URL_SAFE_ENCODE_TABLE• false:STANDARD_ENCODE_TABLE
(default)
コンストラクタ
encodeBase64
• binaryData:byte[]• binaryData:byte[] ,isChunked:boolean• binaryData:byte[] ,isChunked:boolean
,urlSafe:boolean• binaryData:byte[] ,isChunked:boolean
,urlSafe:boolean, maxResultSize:int
encodeBase64
• binaryData• 符号化したいデータ
• nullまたは空配列の場合は、戻り値として引数がそのまま返される
encodeBase64
• isChunked• 符号化したデータを改行するかどうか
• true:76バイト、もしくはlineLengthで指定したバイト数で改行される。(正確にはlineLength / 4 * 4)
• false:改行されない
encodeBase64
• urlSafe• 使用するマッピングテーブルの選択
• 既にコンストラクタで指定していても、Base64.encodeBase64()呼び出し時に指定した値が優先して使用される
encodeBase64
• maxResultSize• データの最大サイズ(バイト)
• 符号化後のデータがここで指定した値よりも大きい場合はIllegalArgumentExceptionが返却される。
encodeBase64
• 内部処理• null/空配列チェック• maxResultSizeサイズチェック• Base64インスタンス生成• encode
• null/空配列チェック• 符号化後サイズ計算• 符号化(データ、EOF)• パディング後処理
decodeBase64
• base64data:byte[]• base64String:String
• 内部でStringUtils.getBytesUtf8() によってUTF-8の文字列としてバイト配列に変換される。
decodeBase64
• 内部処理• 複合後の長さ取得• 複合化(データ、EOF)
org.apache.commons.codec.binary
• バイナリ関連のエンコード/デコード- BinaryEncoder / BinaryDecoder
- Base64- Base64InputStream / Base64OutputStream
- Hex- BinaryCodec
- StringUtils
Hex
• バイト配列を16進数表記の文字列(char配列)に変換。もしくはその逆。• LOWER or UPPER• 詳細な説明は割愛
org.apache.commons.codec.binary
• バイナリ関連のエンコード/デコード- BinaryEncoder / BinaryDecoder
- Base64- Base64InputStream / Base64OutputStream
- Hex- BinaryCodec
- StringUtils
BinaryCodec
• バイト配列を2進数表記の文字列(char配列)に変換。もしくはその逆。• 詳細な説明は割愛
アジェンダ
✓Commons Codecについて概説✓org.apache.commons.codec✓org.apache.commons.codec.binary✓org.apache.commons.codec.digest✓org.apache.commons.codec.language✓org.apache.commons.codec.net✓まとめ
org.apache.commons.codec.digest
• MessageDigest関連の処理の補助的なクラス- DigestUtils
MessageDigest?
• 一方向ハッシュ。不可逆ハッシュ。• MD5、SHA1など
• Javaではjava.security.MessageDigest経由でハンドリングする
• DigestUtilsはMessageDigestクラスの補助ツール的な処理が実装されている。
DigestUtils
• 対応するダイジェスト方式• MD5、SHA1、SHA256、SHA384、SHA51
2• 引数
• バイト配列、Stream、文字列(UTF-8で扱われる)
• 戻り値• バイト配列、16進数表記の文字列
アジェンダ
✓Commons Codecについて概説✓org.apache.commons.codec✓org.apache.commons.codec.binary✓org.apache.commons.codec.digest✓org.apache.commons.codec.language✓org.apache.commons.codec.net✓まとめ
org.apache.commons.codec.language
• 英語圏のPhonetic Algorithm関連の処理※Phonetic Algorithm:語の発音などをもとに検索しやすい様に符号化するアルゴリズム- StringEncoder
- Soundex- Metaphone- RefinedSoundex- DoubleMetaphone- Caverphone
- SoundexUtils
Soundex
• ある英文字から始まる4文字の文字列を生成する。• 一文字目:ある文字列の先頭文字• 二文字目以降:ルールに従い数字を割り当てる
• 似た発音の文字は同じSoundex文字列になる。• “Robert”,”Rupert” → R163
詳しく知りたい人は・・・
各々ググッてください・・・• Soundex
http://en.wikipedia.org/wiki/Soundex• Metaphone
http://en.wikipedia.org/wiki/Metaphone• Caverphone
http://en.wikipedia.org/wiki/Caverphone
アジェンダ
✓Commons Codecについて概説✓org.apache.commons.codec✓org.apache.commons.codec.binary✓org.apache.commons.codec.digest✓org.apache.commons.codec.language✓org.apache.commons.codec.net✓まとめ
org.apache.commons.codec.net
• インターネット上でデータをやり取りする最に使用する符号化方式のエンコーダー/デコーダー- BinaryEncoder / BinaryDecoder / StringEncoder /
StringDecoder- URLCodec- QuotedPrintableCodec- RFC1522Codec
- QCodec- BCodec
- Utils
URLCodec
• いわゆるURLエンコーディング/パーセントエンコーディングと、そのデコードを行うクラス。
• java.net.URLEncoder / URLDecoderの代替ロジックとして用意されている。• Commons Codecのクラスとして再定義されている。• こちらの方が処理のポータビリティは保たれている?(URLCodecで実装してたものをQuotedPrintableに置き換えたりするのが容易)
コンストラクタ
• 無指定• charset:String
• charsetを明示的に指定する• 無指定の場合、デフォルトではUTF-8
encode
• bytes:byte[]• pObject:Object• pString:String• pString:String, charset:String
• charset未指定時は、コンストラクタで指定したcharsetが使用される
encode
• 内部処理• 1バイトづつ読み込み• バイトの判定
• URL Safeなデータだったらそのまま(半角スペースはʼ+ʼに置き換え)• URL Safe:[0-9a-zA-Z-_.* ]
• URL Safeでない場合は4ビットずつ区切って(2分割して)ʼ%ʼ + 16進数文字列表現に置き換え
decode
• bytes:byte[]• pObject:Object• pString:String• pString:String, charset:String
• charset未指定時は、コンストラクタで指定したcharsetが使用される
decode
• 内部処理• 1バイトづつ読み込み• バイトの判定
• URL Safeなデータだったらそのまま(ʼ+ʼは半角スペースに置き換え)• URL Safe:[0-9a-zA-Z-_.* ]
• URL Safeでない場合はʼ%ʼを取り除き、2バイトをビットシフトして合体させて1バイトに
org.apache.commons.codec.net
• インターネット上でデータをやり取りする最に使用する符号化方式のエンコーダー/デコーダー- BinaryEncoder / BinaryDecoder / StringEncoder /
StringDecoder- URLCodec- QuotedPrintableCodec- RFC1522Codec
- QCodec- BCodec
- Utils
QuotedPrintableCodec
• RFC1521• 8ビットデータを7ビットで伝送可能にするための符号化方式。電子メール等に良く使われる。• Content-Transfer-Encoding: quoted-printable
• 符号化方式• 0x21(10進:33)~0x3c(60) ならびに 0x3e(62)~0x72(126)のデータはそのまま。
• それ以外のデータはʼ=ʼ + 4ビットごと分割(2分割)し16進数文字列表現に符号化(ex.ʼ=ʼ→”=3D”)
コンストラクタ
• 無指定• charset:String
• charsetを明示的に指定する• 無指定の場合、デフォルトではUTF-8
encode
• bytes:byte[]• pObject:Object• pString:String• pString:String, charset:String
• charset未指定時は、コンストラクタで指定したcharsetが使用される
encode
• 内部処理• 1バイトづつ読み込み• バイトの判定
• 符号化非対象のデータはそのまま• 符号化対象のデータは4ビットずつ区切って(2分割して)ʼ=ʼ + 16進数文字列表現に置き換え
decode
• bytes:byte[]• pObject:Object• pString:String• pString:String, charset:String
• charset未指定時は、コンストラクタで指定したcharsetが使用される
decode
• 内部処理• 1バイトづつ読み込み• バイトの判定(エスケープ文字ʼ=ʼが出現するかをチェック)• ʻ=ʻでない場合はそのまま• ʻ=ʻ が出現する場合は、以降2バイトをビットシフトして合体させて1バイトに
org.apache.commons.codec.net
• インターネット上でデータをやり取りする最に使用する符号化方式のエンコーダー/デコーダー- BinaryEncoder / BinaryDecoder / StringEncoder /
StringDecoder- URLCodec- QuotedPrintableCodec- RFC1522Codec
- QCodec- BCodec
- Utils
RFC1522Codec
• RFC1521~1522はMIMEに関するRFC• メッセージヘッダに非ASCIIな文字を埋め込むための標準的な仕様が制定される。
• RFC1522Codecはメッセージヘッダの符号化に関する実装• [sample] =?ISO-2022-JP?B?GyRCJD8hIxsoQg==?=• QCodec:Quoted Printable 符号化をベース。• BCodec:Base64符号化をベース。
• 上記サンプル文字列はBCodec
QCodec:コンストラクタ
• 無指定• charset:String
• charsetを明示的に指定する• 無指定の場合、デフォルトではUTF-8
encode
• pObject:Object• pString:String• pString:String, charset:String
• charset未指定時は、コンストラクタで指定したcharsetが使用される
encode
• 内部処理• PREFIX文字列を付加(“=?”)• charset文字列を付加• セパレーター(ʻ?ʼ)• エンコーディング方式を表す文字(QCodecならʼQʼ)を付加
• セパレーター(ʻ?ʼ)• Quoted Printableに基づき符号化したデータを付加• POSTFIX文字列を付加(“?=”)
decode
• pObject:Object• pString:String
• ※QCodecでは符号化データにcharsetが含まれているため、明示的に指定する引数はない
decode
• 内部処理• 先頭がPREFIX、終端がPOSTFIXであるかチェック• セパレーターを区切り文字としてcharset、エンコード方式(QCodec or BCodec)、エンコードデータを取得。
• 取得したデータを元に複合
BCodec
• QCodecとの違いは以下2点。それ以外はQCodecと同じ。• エンコーディング方式を表す文字はʼBʼ• 符号化方式はBase64
アジェンダ
✓Commons Codecについて概説✓org.apache.commons.codec✓org.apache.commons.codec.binary✓org.apache.commons.codec.digest✓org.apache.commons.codec.language✓org.apache.commons.codec.net✓まとめ
本日お伝えしたいこと
符号化方式を理解して快適なインターネットライフを過ごしましょう。
細かいところまで理解したくないけれど実装上必要だ、という場合はCommons Codecが便利なので使いましょう。
まとめ
ご清聴ありがとうございました。
ロケ地:香港