github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/encoding/binary/binary.go (about) 1 // Copyright 2009 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 // binaryパッケージは、数値とバイトシーケンスの間の単純な変換、 6 // およびvarintのエンコードとデコードを実装します。 7 // 8 // 数値は、固定サイズの値を読み書きすることによって変換されます。 9 // 固定サイズの値は、固定サイズの算術型(bool、int8、uint8、int16、float32、complex64など) 10 // または固定サイズの値のみを含む配列または構造体です。 11 // 12 // varint関数は、可変長エンコーディングを使用して単一の整数値をエンコードおよびデコードします。 13 // より小さい値は、より少ないバイトを必要とします。 14 // 仕様については、以下を参照してください。 15 // https://developers.google.com/protocol-buffers/docs/encoding。 16 // 17 // このパッケージは、効率よりもシンプルさを重視しています。 18 // 特に大規模なデータ構造に対して高性能なシリアル化が必要なクライアントは、 19 // [encoding/gob] パッケージやプロトコルバッファ [google.golang.org/protobuf] などのより高度なソリューションを検討する必要があります。 20 package binary 21 22 import ( 23 "github.com/shogo82148/std/io" 24 ) 25 26 // ByteOrderは、バイトスライスを16、32、または64ビットの符号なし整数に変換する方法を指定します。 27 // 28 // これは [LittleEndian]、[BigEndian]、および [NativeEndian] によって実装されています。 29 type ByteOrder interface { 30 Uint16([]byte) uint16 31 Uint32([]byte) uint32 32 Uint64([]byte) uint64 33 PutUint16([]byte, uint16) 34 PutUint32([]byte, uint32) 35 PutUint64([]byte, uint64) 36 String() string 37 } 38 39 // AppendByteOrderは、16、32、または64ビットの符号なし整数をバイトスライスに追加する方法を指定します。 40 // 41 // これは [LittleEndian]、[BigEndian]、および [NativeEndian] によって実装されています。 42 type AppendByteOrder interface { 43 AppendUint16([]byte, uint16) []byte 44 AppendUint32([]byte, uint32) []byte 45 AppendUint64([]byte, uint64) []byte 46 String() string 47 } 48 49 // LittleEndianは、[ByteOrder] および [AppendByteOrder] のリトルエンディアン実装です。 50 var LittleEndian littleEndian 51 52 // BigEndianは、[ByteOrder] および [AppendByteOrder] のビッグエンディアン実装です。 53 var BigEndian bigEndian 54 55 // Readは、rからdataに対して構造化されたバイナリデータを読み取ります。 56 // dataは、固定サイズの値または固定サイズの値のスライスへのポインタである必要があります。 57 // rから読み取られたバイトは、指定されたバイトオーダーを使用してデコードされ、 58 // dataの連続するフィールドに書き込まれます。 59 // ブール値をデコードする場合、ゼロバイトはfalseとしてデコードされ、 60 // それ以外の非ゼロバイトはtrueとしてデコードされます。 61 // 構造体に読み込む場合、ブランク(_)フィールド名を持つフィールドのデータはスキップされます。 62 // つまり、パディングにブランクフィールド名を使用できます。 63 // 構造体に読み込む場合、すべての非ブランクフィールドはエクスポートされている必要があります。 64 // そうでない場合、Readはパニックを引き起こす可能性があります。 65 // 66 // エラーが [io.EOF] であるのは、バイトが読み込まれなかった場合のみです。 67 // 一部のバイトが読み込まれた後に [io.EOF] が発生した場合、 68 // Readは [io.ErrUnexpectedEOF] を返します。 69 func Read(r io.Reader, order ByteOrder, data any) error 70 71 // Writeは、データのバイナリ表現をwに書き込みます。 72 // データは、固定サイズの値または固定サイズの値のスライス、またはそのようなデータへのポインタである必要があります。 73 // ブール値は1がtrue、0がfalseとして1バイトでエンコードされます。 74 // wに書き込まれたバイトは、指定されたバイトオーダーを使用してエンコードされ、 75 // データの連続するフィールドから読み取られます。 76 // 構造体を書き込む場合、ブランク(_)フィールド名を持つフィールドのデータはゼロ値で書き込まれます。 77 func Write(w io.Writer, order ByteOrder, data any) error 78 79 // Sizeは、値vをエンコードするために [Write] が生成するバイト数を返します。 80 // vは、固定サイズの値または固定サイズの値のスライス、またはそのようなデータへのポインタである必要があります。 81 // vがこれらのいずれでもない場合、Sizeは-1を返します。 82 func Size(v any) int