欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實(shí)用庫(kù)之字節(jié)流合成器

 更新時(shí)間:2024年04月19日 12:13:07   作者:希望_睿智  
在處理跨平臺(tái)的數(shù)據(jù)交換或網(wǎng)絡(luò)通信時(shí),字節(jié)流的重要性更加突出,不同的系統(tǒng)可能有不同的字節(jié)序(大端序或小端序),因此在發(fā)送和接收字節(jié)流時(shí),可能需要考慮字節(jié)序的轉(zhuǎn)換,這篇文章主要介紹了C++實(shí)用庫(kù)之字節(jié)流合成器,需要的朋友可以參考下

概述

在C/C++中,字節(jié)流是一種基本的數(shù)據(jù)處理方式,它涉及將數(shù)據(jù)視為連續(xù)的字節(jié)序列進(jìn)行讀取、寫(xiě)入或傳輸。字節(jié)流不關(guān)心數(shù)據(jù)的具體類(lèi)型或結(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)讀取和寫(xiě)入字節(jié)流。在C++中,我們可以使用標(biāo)準(zhǔn)庫(kù)中的istream和ostream類(lèi)來(lái)處理字節(jié)流,特別是通過(guò)ifstream和ofstream類(lèi)來(lái)處理文件中的字節(jié)流。但如果需要?jiǎng)?chuàng)建自定義的字節(jié)流或者進(jìn)行更復(fù)雜的低級(jí)別數(shù)據(jù)傳輸,可能會(huì)涉及網(wǎng)絡(luò)編程或自定義內(nèi)存緩沖區(qū)管理。

CHP_ByteStreamComposer類(lèi)

為了使用面向?qū)ο蟮姆绞较蛏蠈犹峁┖?jiǎn)單、易用、統(tǒng)一的接口,我們需要封裝自己的字節(jié)流合成器。字節(jié)流合成器一般用于網(wǎng)絡(luò)通信時(shí),合成自定義數(shù)據(jù),支持添加整型數(shù)據(jù)、浮點(diǎn)型數(shù)據(jù)、字符串、buffer和對(duì)齊等。CHP_ByteStreamComposer類(lèi)的頭文件,可參考下面的示例代碼。

#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è)枚舉類(lèi)型IHPByteOrderType。添加多字節(jié)數(shù)據(jù)時(shí),可以指定字節(jié)序類(lèi)型為以下三種。

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類(lèi)導(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é)序類(lèi)型,返回值為true表示成功,否則失敗。

AddInt:添加整型數(shù)據(jù)。參數(shù)uiData為整型數(shù)據(jù),參數(shù)type為字節(jié)序類(lèi)型,返回值為true表示成功,否則失敗。

AddInt64:添加64位整型數(shù)據(jù)。參數(shù)ui64Data為64位整型數(shù)據(jù),參數(shù)type為字節(jié)序類(lèi)型,返回值為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)文章

最新評(píng)論