github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/encoding/base32/base32.go (about) 1 // Copyright 2011 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package base32は、RFC 4648で指定されているように、base32エンコーディングを実装します。 6 package base32 7 8 import ( 9 "github.com/shogo82148/std/io" 10 ) 11 12 // Encodingは、32文字のアルファベットによって定義される基数32のエンコーディング/デコーディングスキームです。 13 // 最も一般的なものは、SASL GSSAPIで導入され、RFC 4648で標準化された「base32」エンコーディングです。 14 // 代替の「base32hex」エンコーディングは、DNSSECで使用されます。 15 type Encoding struct { 16 encode [32]byte 17 decodeMap [256]uint8 18 padChar rune 19 } 20 21 const ( 22 StdPadding rune = '=' 23 NoPadding rune = -1 24 ) 25 26 // NewEncodingは、与えられたアルファベットで定義されたパディングされたエンコーディングを返します。 27 // アルファベットは、パディング文字またはCR / LF('\r'、'\n')を含まず、一意のバイト値を含む32バイトの文字列である必要があります。 28 // アルファベットは、マルチバイトUTF-8の特別な処理なしにバイト値のシーケンスとして扱われます。 29 // 結果のエンコーディングは、デフォルトのパディング文字('=')を使用します。 30 // パディング文字を変更または無効にするには、[Encoding.WithPadding] を使用できます。 31 func NewEncoding(encoder string) *Encoding 32 33 // StdEncodingは、RFC 4648で定義されている標準のbase32エンコーディングです。 34 var StdEncoding = NewEncoding(encodeStd) 35 36 // HexEncodingは、RFC 4648で定義されている「Extended Hex Alphabet」です。 37 // 通常、DNSで使用されます。 38 var HexEncoding = NewEncoding(encodeHex) 39 40 // WithPaddingは、指定されたパディング文字またはNoPaddingを使用して、encと同一の新しいエンコーディングを作成します。 41 // パディング文字は'\r'または'\n'ではなく、エンコーディングのアルファベットに含まれていない必要があり、'\xff'以下のルーンである必要があります。 42 // '\x7f'より上のパディング文字は、コードポイントのUTF-8表現を使用する代わりに、その正確なバイト値としてエンコードされます。 43 func (enc Encoding) WithPadding(padding rune) *Encoding 44 45 // Encodeは、エンコーディングencを使用してsrcをエンコードし、 46 // [Encoding.EncodedLen](len(src))バイトをdstに書き込みます。 47 // 48 // エンコーディングは、出力を8バイトの倍数にパディングするため、 49 // 大量のデータストリームの個々のブロックにEncodeを使用することは適切ではありません。 50 // 代わりに [NewEncoder] を使用してください。 51 func (enc *Encoding) Encode(dst, src []byte) 52 53 // AppendEncodeは、base32でエンコードされたsrcをdstに追加し、 54 // 拡張されたバッファを返します。 55 func (enc *Encoding) AppendEncode(dst, src []byte) []byte 56 57 // EncodeToStringは、srcのbase32エンコーディングを返します。 58 func (enc *Encoding) EncodeToString(src []byte) string 59 60 // NewEncoderは、新しいbase32ストリームエンコーダーを返します。 61 // 返されたライターに書き込まれたデータはencを使用してエンコードされ、その後wに書き込まれます。 62 // Base32エンコーディングは5バイトブロックで動作します。 63 // 書き込みが完了したら、呼び出し元は、部分的に書き込まれたブロックをフラッシュするために返されたエンコーダーを閉じる必要があります。 64 func NewEncoder(enc *Encoding, w io.Writer) io.WriteCloser 65 66 // EncodedLenは、長さnの入力バッファのbase32エンコーディングのバイト数を返します。 67 func (enc *Encoding) EncodedLen(n int) int 68 69 type CorruptInputError int64 70 71 func (e CorruptInputError) Error() string 72 73 // Decodeは、エンコーディングencを使用してsrcをデコードし、 74 // [Encoding.DecodedLen](len(src))バイトをdstに書き込みます。 75 // srcに無効なbase32データが含まれている場合、 76 // 書き込まれたバイト数と [CorruptInputError] を返します。 77 // 改行文字(\rおよび\n)は無視されます。 78 func (enc *Encoding) Decode(dst, src []byte) (n int, err error) 79 80 // AppendDecodeは、base32でデコードされたsrcをdstに追加し、 81 // 拡張されたバッファを返します。 82 // 入力が不正な形式の場合、部分的にデコードされたsrcとエラーを返します。 83 func (enc *Encoding) AppendDecode(dst, src []byte) ([]byte, error) 84 85 // DecodeStringは、base32文字列sによって表されるバイト列を返します。 86 func (enc *Encoding) DecodeString(s string) ([]byte, error) 87 88 // NewDecoderは、新しいbase32ストリームデコーダーを構築します。 89 func NewDecoder(enc *Encoding, r io.Reader) io.Reader 90 91 // DecodedLenは、nバイトのbase32エンコードされたデータに対応するデコードされたデータの最大バイト数を返します。 92 func (enc *Encoding) DecodedLen(n int) int