實現類似 Java InputStream/OutputStream 的二進制數據流讀寫組件,支援基本類型(byte, int16, int32, float, double)、字串、原始數據塊的序列化與反序列化,適用於網絡協議封包/解包。
struct fs_output_stream {
BYTE byte_order; // 字節序:大端/小端
BYTE *data; // 動態緩衝區
size_t pos; // 當前寫入位置
size_t buff_len; // 緩衝區總容量
fs_script_id script_id; // 腳本標識(擴展用)
};
struct fs_input_stream {
BYTE byte_order;
BYTE *data;
size_t pos; // 當前讀取位置
size_t len; // 數據總長度
fs_bool copy; // 是否擁有數據所有權
fs_script_id script_id;
};
void fs_stream_write_data(struct fs_output_stream* stream, BYTE* data, size_t len) {
// 空間不足時雙倍擴容
while (stream->pos + len > stream->buff_len) {
void* new_data = fs_realloc(stream->data, stream->buff_len << 1);
stream->data = (BYTE*)new_data;
stream->buff_len <<= 1;
}
memcpy(stream->data + stream->pos, data, len);
stream->pos += len;
}
所有具體類型寫入(write_uint32 等)均調用此基礎函數,通過 memcpy 實現類型無關的字節拷貝。
結構體保存 byte_order 字段,讀寫時可根據需要進行字節序轉換(代碼中宏 _stream_read 直接 memcpy,假設主機序與網絡序一致,實際項目需加入 htonl/ntohl 轉換)。
fs_create_input_stream:零拷貝模式,直接引用外部緩衝區,copy=false,釋放時不釋放數據。fs_create_input_stream_with_copy:深拷貝模式,內部分配記憶體複製數據,copy=true,釋放時連同數據一起釋放。代碼中 fs_stream_read_string 返回 0 為佔位,實際實現需協議約定:
\0 結尾:逐字節讀取直到遇到 0fs_malloc/fs_free/fs_realloc 統一內存管理,便於替換內存池、檢測洩漏。fs_zero 宏確保結構體初始化為 0,避免未初始化字段導致未定義行為。copy 標誌決定是否釋放數據緩衝區。fs_output_stream 序列化 → 發送fs_input_stream 反序列化 → 業務邏輯處理