<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] ## binary.Size 獲取結構體的大小 固定大小的結構體,就要求結構體中不能出現\[\]byte這樣的切片成員,否則Size返回-1,且不能進行正常的序列化操作 code ``` a0 := 123 // or a0 := "123" fmt.Printf("a0 : %d \n", binary.Size(a0)) // -1 a1 := int16(123) fmt.Printf("a1 : %d \n", binary.Size(a1)) // 2 a2 := uint16(123) fmt.Printf("a2 : %d \n", binary.Size(a2)) // 2 a3 := uint32(123) fmt.Printf("a3 : %d \n", binary.Size(a3)) // 4 a4 := uint64(123) fmt.Printf("a4 : %d \n", binary.Size(a4)) // 8 type b struct { b1 uint16 b2 uint32 } var B b fmt.Printf("B : %d \n", binary.Size(B)) //6 B.b1 = uint16(32) fmt.Printf("B : %d \n", binary.Size(B)) //6 ``` ## 小端序與大端序 序列化 1. 網絡的數據是以大端數據模式進行交互 2. 主機大多數以小端模式處理,如果不轉換,數據會混亂 數值`0x2211`使用兩個字節儲存:高位字節是`0x22`,低位字節是`0x11`,**并不是數值的大小** * **大端字節序**:高位字節在前,低位字節在后,這是人類讀寫數值的方法。 * **小端字節序**:低位字節在前,高位字節在后,即以`0x1122`形式儲存。 ``` a :=int32(65535) buf :=new(bytes.Buffer) binary.Write(buf,binary.LittleEndian,a) fmt.Printf("%+v\n", buf.Bytes()) // [255 255 0 0] buf2 :=new(bytes.Buffer) binary.Write(buf2,binary.BigEndian,a) fmt.Printf("%+v\n", buf2.Bytes()) // [0 0 255 255] ``` > 結構體也可同理實現小端序,大端序的序列化 ### 結構體轉為序列化 ``` type A struct { One int32 Two int32 } var a A a.One = int32(1) a.Two = int32(3) fmt.Println("a's size is ", binary.Size(a)) // 8 buf := new(bytes.Buffer) binary.Write(buf, binary.LittleEndian, a) fmt.Println("after write ,buf is:", buf.Bytes()) //[1 0 0 0 3 0 0 0] ``` 1. 這里采用了小端序的方式進行序列化(x86架構都是小端序,網絡字節序是大端序) 2. 對于結構體中得“_”成員不進行序列化 3. 結構體中不能出現\[\]byte這樣的切片成員,否則Size返回-1 ### 序列化(buffer)轉結構體 ``` type A struct { One uint16 Two int32 } var aa A aa.One=65535 var bb A buf := new(bytes.Buffer) binary.Write(buf,binary.LittleEndian,aa) //序列化 binary.Read(buf,binary.LittleEndian,&bb) //反序列化 fmt.Printf("%+v\n", bb) //{One:65535 Two:0} ``` > 只有多于一位的才需要指定大端序 ### 編碼字節切片 ``` // write v := uint32(500) buf := make([]byte,4) //需大于4位, 過小 拋出異常 index out of range [3] with length 3 binary.BigEndian.PutUint32(buf, v) // read x := binary.BigEndian.Uint32(buf) fmt.Printf("%+v\n", x) ``` ### 流處理 讀寫固定長度值的流 (stream) Read 通過指定類型的字節序把字節解碼 (decode) 到 data 變量中。解碼布爾類型時,0 字節 (也就是 `[]byte{0x00}` ) 為 false, 其他都為 true Read ``` func main() { var( piVar float64 boolVar bool ) piByte := []byte{0x18, 0x2d, 0x44, 0x54, 0xfb, 0x21, 0x09, 0x40} boolByte := []byte{0x00} piBuffer := bytes.NewReader(piByte) boolBuffer := bytes.NewReader(boolByte) binary.Read(piBuffer, binary.LittleEndian, &piVar) binary.Read(boolBuffer, binary.LittleEndian, & boolVar) fmt.Println("pi", piVar) // pi 3.141592653589793 fmt.Println("bool", boolVar) // bool false } ``` Write ``` func main() { buf := new(bytes.Buffer) var pi float64 = math.Pi err := binary.Write(buf, binary.LittleEndian, pi) if err != nil { fmt.Println("binary.Write failed:", err) } fmt.Printf("% x", buf.Bytes()) // 18 2d 44 54 fb 21 09 40 } ``` 在實際編碼中,面對復雜的數據結構,可考慮使用更標準化高效的協議,比如[google-Protocol Buffer](https://developers.google.com/protocol-buffers/) ### 包頭定義的例子 ``` // 定義協議 type Pack struct { Length uint32 // 長度 4個字節 Order uint32 // 序號 SecretKey1 byte // 隨機秘鑰1 SecretKey2 byte // 隨機秘鑰2 Cmd constant.CmdCode // cmd 命令 如 0x0008=為登錄 0x0008=登出 StaticCode constant.StaticCode // 狀態 0-正常 1-出錯 2-命令未完成 0x000 3-命令需要ack Encryption constant.EncrCode // 加密: 0-誤操作 1-AES256 2-國產sm4 Reserv uint16 // 隨機值 Body []byte // body Ext Ext } // Pack 的值賦值給 writer func (p *Pack) Pack(writer io.Writer) error { var err error err = binary.Write(writer, binary.BigEndian, &p.Length) err = binary.Write(writer, binary.BigEndian, &p.Order) err = binary.Write(writer, binary.BigEndian, &p.SecretKey1) err = binary.Write(writer, binary.BigEndian, &p.SecretKey2) err = binary.Write(writer, binary.BigEndian, &p.Cmd) err = binary.Write(writer, binary.BigEndian, &p.StaticCode) err = binary.Write(writer, binary.BigEndian, &p.Encryption) err = binary.Write(writer, binary.BigEndian, &p.Reserv) err = binary.Write(writer, binary.BigEndian, &p.Body) return err } // pack的值復制給 reader func (p *Pack) UnPack(b []byte) error { reader := bytes.NewReader(b) var err error err = binary.Read(reader, binary.BigEndian, &p.Length) err = binary.Read(reader, binary.BigEndian, &p.Order) err = binary.Read(reader, binary.BigEndian, &p.SecretKey1) err = binary.Read(reader, binary.BigEndian, &p.SecretKey2) err = binary.Read(reader, binary.BigEndian, &p.Cmd) err = binary.Read(reader, binary.BigEndian, &p.StaticCode) err = binary.Read(reader, binary.BigEndian, &p.Encryption) err = binary.Read(reader, binary.BigEndian, &p.Reserv) p.Body = make([]byte, p.Length-HAND_BODY) err = binary.Read(reader, binary.BigEndian, &p.Body) return err } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看