如何在 C 語言中為 Protocol Buffer 實現定界 I/O?
Protocol Buffers 中的分隔I/O 函數:C 等效項
從兩個協定緩衝區中的檔案讀取或寫入多個Protocol Buffers 訊息的情況下C 和Java,有必要在訊息中附加長度前綴。雖然 Java API 為此目的提供了專用的「定界」I/O 函數,但它們在 C 中的等效函數可能並不明顯。
最近的更新表明此類 C 等效函數現在駐留在 google/protobuf/util 中/delimited_message_util.h 作為版本 3.3.0 的一部分。然而,在此更新之前,有一些替代實作可以有效地滿足此要求。
其中一個實作由 C 和 Java protobuf 函式庫的前作者提供,包括防止 64MB 輸入後潛在故障的最佳化。如下圖所示,這些實作對單一訊息強制實施 64MB 限制,確保串流媒體無縫繼續進行而不超過整體限制。
針對C 的最佳化定界I/O 實作
<code class="cpp">bool writeDelimitedTo( const google::protobuf::MessageLite& message, google::protobuf::io::ZeroCopyOutputStream* rawOutput) { // Initialize a CodedOutputStream for each message. google::protobuf::io::CodedOutputStream output(rawOutput); // Determine the message size and write it as a Varint. int size = message.ByteSize(); output.WriteVarint32(size); // Optimize for messages fitting into a single buffer. uint8_t* buffer = output.GetDirectBufferForNBytesAndAdvance(size); if (buffer != NULL) message.SerializeWithCachedSizesToArray(buffer); else message.SerializeWithCachedSizes(&output); return true; } bool readDelimitedFrom( google::protobuf::io::ZeroCopyInputStream* rawInput, google::protobuf::MessageLite* message) { // Initialize a CodedInputStream for each message. google::protobuf::io::CodedInputStream input(rawInput); // Read the message size. uint32_t size; if (!input.ReadVarint32(&size)) return false; // Restrict reading to the determined message size. google::protobuf::io::CodedInputStream::Limit limit = input.PushLimit(size); // Parse the message and verify it fits within the limit. if (!message->MergeFromCodedStream(&input)) return false; if (!input.ConsumedEntireMessage()) return false; // Lift the reading restriction. input.PopLimit(limit); return true; }</code>
這些最佳化的實作有效地處理不同大小的訊息,並為C 中的分隔I /O 提供可靠的解決方案。
以上是如何在 C 語言中為 Protocol Buffer 實現定界 I/O?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

在使用IntelliJIDEAUltimate版本啟動Spring...

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...
