C++實(shí)用庫(kù)之字節(jié)流合成器
概述
在C/C++中,字節(jié)流是一種基本的數(shù)據(jù)處理方式,它涉及將數(shù)據(jù)視為連續(xù)的字節(jié)序列進(jìn)行讀取、寫入或傳輸。字節(jié)流不關(guān)心數(shù)據(jù)的具體類型或結(jié)構(gòu),只關(guān)心字節(jié)的順序和值。這種處理方式對(duì)于跨平臺(tái)數(shù)據(jù)交換、網(wǎng)絡(luò)通信、文件存儲(chǔ)等場(chǎng)景非常有用。
在C語(yǔ)言中,字節(jié)流通常通過(guò)文件I/O函數(shù)和標(biāo)準(zhǔn)I/O庫(kù)來(lái)處理。比如,我們可以使用fread和fwrite函數(shù)來(lái)讀取和寫入字節(jié)流。在C++中,我們可以使用標(biāo)準(zhǔn)庫(kù)中的istream和ostream類來(lái)處理字節(jié)流,特別是通過(guò)ifstream和ofstream類來(lái)處理文件中的字節(jié)流。但如果需要?jiǎng)?chuàng)建自定義的字節(jié)流或者進(jìn)行更復(fù)雜的低級(jí)別數(shù)據(jù)傳輸,可能會(huì)涉及網(wǎng)絡(luò)編程或自定義內(nèi)存緩沖區(qū)管理。
CHP_ByteStreamComposer類
為了使用面向?qū)ο蟮姆绞较蛏蠈犹峁┖?jiǎn)單、易用、統(tǒng)一的接口,我們需要封裝自己的字節(jié)流合成器。字節(jié)流合成器一般用于網(wǎng)絡(luò)通信時(shí),合成自定義數(shù)據(jù),支持添加整型數(shù)據(jù)、浮點(diǎn)型數(shù)據(jù)、字符串、buffer和對(duì)齊等。CHP_ByteStreamComposer類的頭文件,可參考下面的示例代碼。
#pragma once
#include "HP_Types.h"
class CHP_ByteStreamComposer
{
public:
CHP_ByteStreamComposer();
~CHP_ByteStreamComposer();
enum IHPByteOrderType
{
HPByteOrderType_Default,
HPByteOrderType_ForceHost,
HPByteOrderType_ForceNetwork
};
bool Init(int nStreamLen, char *pStream = NULL, bool bNetworkByteOrder = false);
char *GetStream();
int GetStreamLen();
int GetCurPos();
bool AddChar(unsigned char ucData);
bool AddShort(unsigned short usData, IHPByteOrderType type = HPByteOrderType_Default);
bool AddInt(unsigned int uiData, IHPByteOrderType type = HPByteOrderType_Default);
bool AddInt64(HP_U64 ui64Data, IHPByteOrderType type = HPByteOrderType_Default);
bool AddFloat(float fData);
bool AddDouble(double dbData);
bool AddStr(const char *pszData);
bool AddBuf(void *pBuf, int nBufLen);
bool AddPad(int nPad);
bool Skip(int nLen);
void Reset();
private:
bool CheckAdd(int nLen);
private:
bool m_bAlloced;
char *m_pStream;
int m_nStreamLen;
int m_nCurPos;
bool m_bNetworkByteOrder;
};在上面的示例代碼中,我們聲明了一個(gè)枚舉類型IHPByteOrderType。添加多字節(jié)數(shù)據(jù)時(shí),可以指定字節(jié)序類型為以下三種。
HPByteOrderType_Default:默認(rèn)字節(jié)序,以Init函數(shù)中傳入的字節(jié)序?yàn)闇?zhǔn)。
HPByteOrderType_ForceHost:強(qiáng)制本地字節(jié)序。
HPByteOrderType_ForceNetwork:強(qiáng)制網(wǎng)絡(luò)字節(jié)序。
下面,我們逐個(gè)介紹CHP_ByteStreamComposer類導(dǎo)出的公共接口。
Init:初始化函數(shù)。參數(shù)nStreamLen為要合成的流的長(zhǎng)度;參數(shù)pStream為要合成的流的指針,傳NULL時(shí),由內(nèi)部自動(dòng)分配和釋放;bNetworkByteOrder表示添加數(shù)據(jù)時(shí),是否使用網(wǎng)絡(luò)字節(jié)序;返回值為true表示成功,否則失敗。
GetStream:獲取流的指針。返回值為流的指針。
GetStreamLen:獲取流的長(zhǎng)度。返回值為流的長(zhǎng)度。
GetCurPos:獲取流中添加數(shù)據(jù)的當(dāng)前位置。返回值為流中添加數(shù)據(jù)的當(dāng)前位置。
AddChar:添加字符數(shù)據(jù)。參數(shù)ucData為字符數(shù)據(jù),返回值為true表示成功,否則失敗。
AddShort:添加短整型數(shù)據(jù)。參數(shù)usData為短整型數(shù)據(jù),參數(shù)type為字節(jié)序類型,返回值為true表示成功,否則失敗。
AddInt:添加整型數(shù)據(jù)。參數(shù)uiData為整型數(shù)據(jù),參數(shù)type為字節(jié)序類型,返回值為true表示成功,否則失敗。
AddInt64:添加64位整型數(shù)據(jù)。參數(shù)ui64Data為64位整型數(shù)據(jù),參數(shù)type為字節(jié)序類型,返回值為true表示成功,否則失敗。
AddFloat:添加單精度浮點(diǎn)型數(shù)據(jù)。參數(shù)fData為單精度浮點(diǎn)型數(shù)據(jù),返回值為true表示成功,否則失敗。
AddDouble:添加雙精度浮點(diǎn)型數(shù)據(jù)。參數(shù)dbData為雙精度浮點(diǎn)型數(shù)據(jù),返回值為true表示成功,否則失敗。
AddStr:添加字符串型數(shù)據(jù)。參數(shù)pszData為字符串型數(shù)據(jù),返回值為true表示成功,否則失敗。
AddBuf:添加buffer數(shù)據(jù)。參數(shù)pBuf為buffer數(shù)據(jù),參數(shù)nBufLen為buffer數(shù)據(jù)長(zhǎng)度,返回值為true表示成功,否則失敗。
AddPad:添加對(duì)齊。假如當(dāng)前位置為11,若nPad為4,則會(huì)添加1個(gè)字節(jié)的對(duì)齊;若nPad為8,則會(huì)添加5個(gè)字節(jié)的對(duì)齊。參數(shù)nPad為對(duì)齊字節(jié)數(shù),返回值為true表示成功,否則失敗。
Skip:跳過(guò)指定長(zhǎng)度的數(shù)據(jù)。參數(shù)nLen為要跳過(guò)數(shù)據(jù)的長(zhǎng)度,返回值為true表示成功,否則失敗。
Reset:重置流,重置后,所有數(shù)據(jù)清零,且當(dāng)前位置也為零,可以重新開(kāi)始合成流。
總結(jié)
在處理跨平臺(tái)的數(shù)據(jù)交換或網(wǎng)絡(luò)通信時(shí),字節(jié)流的重要性更加突出。不同的系統(tǒng)可能有不同的字節(jié)序(大端序或小端序),因此在發(fā)送和接收字節(jié)流時(shí),可能需要考慮字節(jié)序的轉(zhuǎn)換。此外,還需要確保數(shù)據(jù)的對(duì)齊和填充符合通信協(xié)議的要求。在網(wǎng)絡(luò)通信中,字節(jié)流通常通過(guò)套接字進(jìn)行傳輸。
到此這篇關(guān)于C++實(shí)用庫(kù)之字節(jié)流合成器的文章就介紹到這了,更多相關(guān)C++字節(jié)流合成器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中運(yùn)算符重載的規(guī)則語(yǔ)法實(shí)例
今天小編就為大家分享一篇關(guān)于C++中運(yùn)算符重載的規(guī)則語(yǔ)法實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
C++實(shí)現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
Java?C++?算法題解leetcode669修剪二叉搜索樹(shù)示例
這篇文章主要為大家介紹了Java?C++?算法題解leetcode669修剪二叉搜索樹(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
QT如何通過(guò)鼠標(biāo)事件實(shí)現(xiàn)圖片的拖動(dòng)和縮放
本文介紹了如何通過(guò)鼠標(biāo)拖動(dòng)移動(dòng)圖片以及使用鼠標(biāo)滾輪進(jìn)行圖片縮放的技術(shù)實(shí)現(xiàn),包括完整的解決方案,ImageWidget.h、ImageWidget.cpp和main.cpp的編寫,以及詳細(xì)的函數(shù)解釋,如paintEvent()重繪圖片,以及平滑縮放和偏移量的應(yīng)用等,需要的朋友可以參考下2024-10-10
C語(yǔ)言實(shí)現(xiàn)整數(shù)逆序的情況解析
今天通過(guò)本文給大家介紹C語(yǔ)言實(shí)現(xiàn)整數(shù)逆序的情況,本文通過(guò)實(shí)例代碼多種舉例給大家介紹的非常詳細(xì),對(duì)C語(yǔ)言整數(shù)逆序相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧2021-11-11
C語(yǔ)言 如何求兩整數(shù)的最大公約數(shù)與最小公倍數(shù)
這篇文章主要介紹了C語(yǔ)言中如何求兩整數(shù)的最大公約數(shù)與最小公倍數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
C語(yǔ)言函數(shù)參數(shù)詳解之實(shí)際參數(shù)(實(shí)參)&形式參數(shù)(形參)詳解
本文給大家講解C語(yǔ)言函數(shù)參數(shù)詳解之實(shí)際參數(shù)(實(shí)參)&形式參數(shù)(形參)的相關(guān)知識(shí),包括基礎(chǔ)概念和示例代碼,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2025-09-09
關(guān)于VS2019 C++項(xiàng)目同時(shí)出現(xiàn)LNK2005 和LNK1169 error 的解決辦法
這篇文章主要介紹了關(guān)于VS2019 C++項(xiàng)目同時(shí)出現(xiàn)LNK2005 和LNK1169 error 的解決辦法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04

