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