<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>

                ~~~ package main import ( "bytes" "encoding/binary" "fmt" "github.com/klauspost/compress/zstd" "log" ) var ( /* 但凡是涉及到多字節的數值(整數、浮點數等)時,通常都需要明確字節序(如 uint16、uint32、int64、float64 等) 數值在二進制存儲和傳輸時確實需要指定字節序(大端或小端),因為不同的系統可能采用不同的字節序 大端字節序:高位字節放在前面,低位字節放在后面 小端字節序:低位字節放在前面,高位字節放在后面 */ byteOrder = binary.BigEndian //全局緩沖區 buffer []byte maxBufferSize = 10 * 1024 * 1024 // 增加 buffer 的最大大小限制,防止內存泄露 ) // 壓縮數據 func ZSTDEncoder(data []byte) []byte { var buf bytes.Buffer encoder, err := zstd.NewWriter(&buf) if err != nil { return nil } defer encoder.Close() _, err = encoder.Write(data) if err != nil { return nil } err = encoder.Close() if err != nil { return nil } return buf.Bytes() } // 解壓數據 func ZSTDDecoder(data []byte) ([]byte, error) { decoder, err := zstd.NewReader(nil) if err != nil { return nil, err } defer decoder.Close() decompressedData, err := decoder.DecodeAll(data, nil) if err != nil { return nil, err } return decompressedData, nil } // 創建數據包(4字節數據長度 + 數據 + 1字節結束符OxFF) func createPacket(data []byte) []byte { var buf bytes.Buffer // 壓縮數據 compressedData := ZSTDEncoder(data) //4字節數據長度 length := uint32(len(compressedData)) err := binary.Write(&buf, byteOrder, length) if err != nil { log.Fatal(err) } // 數據(壓縮后的數據) buf.Write(compressedData) // 1字節結束符OxFF buf.WriteByte(0xFF) return buf.Bytes() } // 解析數據包 func sendPacket(packet []byte) { // 追加數據到全局緩沖區 if packet != nil { buffer = append(buffer, packet...) if len(buffer) > maxBufferSize { fmt.Println("buffer長度溢出, 清除緩沖區") buffer = nil return } } // 解析數據包 for { // 需要至少 5 字節數據(4 字節長度 + 1 字節結束符) if len(buffer) < 5 { break } // 讀取長度字段(4 字節) var length uint32 err := binary.Read(bytes.NewReader(buffer[:4]), byteOrder, &length) if err != nil { break // 數據不足,等待更多數據 } // 計算完整數據包的長度 expectedLength := 4 + int(length) + 1 if len(buffer) < expectedLength { break // 數據不足,等待更多數據 } // 讀取數據部分 compressedData := buffer[4 : 4+length] // 檢查結束符(0xFF) if buffer[expectedLength-1] != 0xFF { fmt.Println("錯誤的結束符, 丟棄損壞的數據包") // **從當前 buffer 中查找下一個可能的正確數據包** found := false for i := 1; i < len(buffer)-4; i++ { if buffer[i] == 0xFF { buffer = buffer[i+1:] // 丟棄錯誤數據,繼續解析 found = true break } } if !found { buffer = nil // 沒有找到新的起點,清空 buffer } continue } // 解壓數據 data, err := ZSTDDecoder(compressedData) if err != nil { fmt.Println("Error: Failed to decompress data, discarding corrupted packet") buffer = buffer[expectedLength:] // 丟棄錯誤數據 continue } // 打印解析結果 fmt.Println("Parsed Data:", string(data)) // 移除已解析的數據 buffer = buffer[expectedLength:] } } func main() { // 原始數據 data := []byte("Hello, World!") packet := createPacket(data) fmt.Println("----------------------模擬半包-------------------------") packet1 := packet[0:3] packet2 := packet[3:8] packet3 := packet[8:] sendPacket(packet1) sendPacket(packet2) sendPacket(packet3) fmt.Println("----------------------模擬粘包-------------------------") combinedPacket := append(packet, packet...) combinedPacket = append(combinedPacket, packet...) sendPacket(combinedPacket) fmt.Println("----------------------模擬數據損壞或丟包-------------------------") badPacket := append(createPacket([]byte("Corrupt Data")), 0x00) // 添加錯誤的結尾 sendPacket(badPacket) sendPacket(packet) sendPacket(packet) sendPacket(packet) } //RSA算法(非對稱加密算法) //全局 buffer 并發不安全,需要 sync.Mutex 或 channel 解決競爭問題 //1.對壓縮數據中的 0xFF 進行轉義 給出對于的代碼 或這個改成數據校驗 //2.問題:頻繁的 append 和切片操作可能引發內存拷貝。改進:使用 bytes.Buffer 或預分配緩沖區 給出對應的代碼 //如果你的數據量較大,建議優化 并發處理,比如: //生產者-消費者模型(goroutine + channel) //去掉 0xFF 結束符,直接用 [4字節長度] + 數據 解析 //[2字節協議版本][2字節消息類型][4字節數據長度][數據][2字節校驗和][1字節結束符(0xFF)] //問題:數據在傳輸中可能損壞(如長度字段被篡改)。 //改進:在協議頭或尾部加入校驗字段(如 CRC32) //問題:頻繁的 append 和切片操作可能引發內存拷貝。 //改進:使用 bytes.Buffer 或預分配緩沖區 /* 開始符(Start byte): 0xAA 作為開始符,表示數據包的開始,確保不會誤解析。 數據長度(Length): 使用 4 字節存儲數據(壓縮數據)的長度。由于采用了大端字節序,跨平臺時數據可以正確解析。 序列號(Sequence Number): 用 4 字節存儲,每個數據包都帶有一個遞增的序列號,用來保證包的順序性,防止亂序或重放攻擊。 時間戳(Timestamp): 使用 8 字節存儲 Unix 時間戳,表示數據包創建的時間,可以防止重放攻擊(例如,如果數據包的時間戳超出一定范圍,則認為是篡改的)。 消息認證碼(MAC): 使用 HMAC-SHA256 對數據(包括數據長度、壓縮數據、序列號、時間戳等)進行簽名,確保數據包未被篡改。 HMAC 密鑰由發送方與接收方共享。 壓縮數據(Compressed Data): 將數據壓縮后存儲,減少數據傳輸大小。 結束符(End byte): 0xFF 作為結束符,確保數據包的結束。 */ //白名單 ~~~
                  <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>

                              哎呀哎呀视频在线观看