日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#实现ByteBuffer类 .

發布時間:2023/12/9 C# 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#实现ByteBuffer类 . 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?在寫網絡程序的時候,經常需要往一個數組里面壓數據或者取數據,而Java中再Java.nio中有個ByteBuffer能很方便的實現,Delphi中也有個Stream類有著同樣的功能,這里我就模仿JAVA用C#做個最基礎的ByteBuffer類

?????????? 下面是代碼

??????????

using?System;


namespace?System.ByteBuffer
...{
????
/**////?<summary>
????
///?創建一個可變長的Byte數組方便Push數據和Pop數據
????
///?數組的最大長度為1024,超過會產生溢出
????
///?數組的最大長度由常量MAX_LENGTH設定
????
///?
????
///?注:由于實際需要,可能要從左到右取數據,所以這里
????
///?定義的Pop函數并不是先進后出的函數,而是從0開始.
????
///?
????
///?@Author:?Red_angelX
????
///?</summary>

????class?ByteBuffer
????
...{
????????
//數組的最大長度
????????private?const?int?MAX_LENGTH?=?1024;
????????
????????
//固定長度的中間數組
????????private?byte[]?TEMP_BYTE_ARRAY?=?new?byte[MAX_LENGTH];
????????
????????
//當前數組長度
????????private?int?CURRENT_LENGTH?=?0;

????????
//當前Pop指針位置
????????private?int?CURRENT_POSITION?=?0;

????????
//最后返回數組
????????private?byte[]?RETURN_ARRAY;

????????
/**////?<summary>
????????
///?默認構造函數
????????
///?</summary>

????????public?ByteBuffer()
????????
...{
????????????
this.Initialize();
????????}


????????
/**////?<summary>
????????
///?重載的構造函數,用一個Byte數組來構造
????????
///?</summary>
????????
///?<param?name="bytes">用于構造ByteBuffer的數組</param>

????????public?ByteBuffer(byte[]?bytes)
????????
...{
????????????
this.Initialize();
????????????
this.PushByteArray(bytes);
????????}

????

????????
/**////?<summary>
????????
///?獲取當前ByteBuffer的長度
????????
///?</summary>

????????public?int?Length
????????
...{
????????????
get
????????????
...{
????????????????
return?CURRENT_LENGTH;
????????????}

????????}


????????
/**////?<summary>
????????
///?獲取/設置當前出棧指針位置
????????
///?</summary>

????????public?int?Position
????????
...{
????????????
get
????????????
...{
????????????????
return?CURRENT_POSITION;
????????????}

????????????
set
????????????
...{
????????????????CURRENT_POSITION?
=?value;
????????????}

????????}


????????
/**////?<summary>
????????
///?獲取ByteBuffer所生成的數組
????????
///?長度必須小于?[MAXSIZE]
????????
///?</summary>
????????
///?<returns>Byte[]</returns>

????????public?byte[]?ToByteArray()
????????
...{
????????????
//分配大小
????????????RETURN_ARRAY?=?new?byte[CURRENT_LENGTH];
????????????
//調整指針
????????????Array.Copy(TEMP_BYTE_ARRAY,?0,?RETURN_ARRAY,?0,?CURRENT_LENGTH);
????????????
return?RETURN_ARRAY;
????????}


????????
/**////?<summary>
????????
///?初始化ByteBuffer的每一個元素,并把當前指針指向頭一位
????????
///?</summary>

????????public?void?Initialize()
????????
...{
????????????TEMP_BYTE_ARRAY.Initialize();
????????????CURRENT_LENGTH?
=?0;
????????????CURRENT_POSITION?
=?0;
????????}


????????
/**////?<summary>
????????
///?向ByteBuffer壓入一個字節
????????
///?</summary>
????????
///?<param?name="by">一位字節</param>

????????public?void?PushByte(byte?by)
????????
...{
????????????TEMP_BYTE_ARRAY[CURRENT_LENGTH
++]?=?by;
????????}


????????
/**////?<summary>
????????
///?向ByteBuffer壓入數組
????????
///?</summary>
????????
///?<param?name="ByteArray">數組</param>

????????public?void?PushByteArray(byte[]?ByteArray)
????????
...{
????????????
//把自己CopyTo目標數組
????????????ByteArray.CopyTo(TEMP_BYTE_ARRAY,?CURRENT_LENGTH);
????????????
//調整長度
????????????CURRENT_LENGTH?+=?ByteArray.Length;
????????}


????????
/**////?<summary>
????????
///?向ByteBuffer壓入兩字節的Short
????????
///?</summary>
????????
///?<param?name="Num">2字節Short</param>

????????public?void?PushUInt16(UInt16?Num)
????????
...{
????????????TEMP_BYTE_ARRAY[CURRENT_LENGTH
++]?=?(byte)(((Num?&?0xff00)?>>?8)?&?0xff);
????????????TEMP_BYTE_ARRAY[CURRENT_LENGTH
++]?=?(byte)((Num?&?0x00ff)?&?0xff);
????????}


????????
/**////?<summary>
????????
///?向ByteBuffer壓入一個無符Int值
????????
///?</summary>
????????
///?<param?name="Num">4字節UInt32</param>

????????public?void?PushInt(UInt32?Num)
????????
...{
????????????TEMP_BYTE_ARRAY[CURRENT_LENGTH
++]?=?(byte)(((Num?&?0xff000000)?>>?24)?&?0xff);
????????????TEMP_BYTE_ARRAY[CURRENT_LENGTH
++]?=?(byte)(((Num?&?0x00ff0000)?>>?16)?&?0xff);
????????????TEMP_BYTE_ARRAY[CURRENT_LENGTH
++]?=?(byte)(((Num?&?0x0000ff00)?>>?8)?&?0xff);
????????????TEMP_BYTE_ARRAY[CURRENT_LENGTH
++]?=?(byte)((Num?&?0x000000ff)?&?0xff);
????????}


????????
/**////?<summary>
????????
///?向ByteBuffer壓入一個Long值
????????
///?</summary>
????????
///?<param?name="Num">4字節Long</param>

????????public?void?PushLong(long?Num)
????????
...{
????????????TEMP_BYTE_ARRAY[CURRENT_LENGTH
++]?=?(byte)(((Num?&?0xff000000)?>>?24)?&?0xff);
????????????TEMP_BYTE_ARRAY[CURRENT_LENGTH
++]?=?(byte)(((Num?&?0x00ff0000)?>>?16)?&?0xff);
????????????TEMP_BYTE_ARRAY[CURRENT_LENGTH
++]?=?(byte)(((Num?&?0x0000ff00)?>>?8)?&?0xff);
????????????TEMP_BYTE_ARRAY[CURRENT_LENGTH
++]?=?(byte)((Num?&?0x000000ff)?&?0xff);
????????}


????????
/**////?<summary>
????????
///?從ByteBuffer的當前位置彈出一個Byte,并提升一位
????????
///?</summary>
????????
///?<returns>1字節Byte</returns>

????????public?byte?PopByte()
????????
...{
????????????
byte?ret?=?TEMP_BYTE_ARRAY[CURRENT_POSITION++];
????????????
return?ret;
????????}


????????
/**////?<summary>
????????
///?從ByteBuffer的當前位置彈出一個Short,并提升兩位
????????
///?</summary>
????????
///?<returns>2字節Short</returns>

????????public?UInt16?PopUInt16()
????????
...{
????????????
//溢出
????????????if?(CURRENT_POSITION?+?1?>=?CURRENT_LENGTH)
????????????
...{
????????????????
return?0;
????????????}

????????????UInt16?ret?
=?(UInt16)(TEMP_BYTE_ARRAY[CURRENT_POSITION]?<<?8?|?TEMP_BYTE_ARRAY[CURRENT_POSITION?+?1]);
????????????CURRENT_POSITION?
+=?2;
????????????
return?ret;
????????}


????????
/**////?<summary>
????????
///?從ByteBuffer的當前位置彈出一個uint,并提升4位
????????
///?</summary>
????????
///?<returns>4字節UInt</returns>

????????public?uint?PopUInt()
????????
...{????????????
????????????
if?(CURRENT_POSITION?+?3?>=?CURRENT_LENGTH)
????????????????
return?0;
????????????
uint?ret?=?(uint)(TEMP_BYTE_ARRAY[CURRENT_POSITION]?<<?24?|?TEMP_BYTE_ARRAY[CURRENT_POSITION?+?1]?<<?16?|?TEMP_BYTE_ARRAY[CURRENT_POSITION?+?2]?<<?8?|?TEMP_BYTE_ARRAY[CURRENT_POSITION?+?3]);
????????????CURRENT_POSITION?
+=?4;
????????????
return?ret;
????????}


????????
/**////?<summary>
????????
///?從ByteBuffer的當前位置彈出一個long,并提升4位
????????
///?</summary>
????????
///?<returns>4字節Long</returns>

????????public?long?PopLong()
????????
...{
????????????
if?(CURRENT_POSITION?+?3?>=?CURRENT_LENGTH)
????????????????
return?0;
????????????
long?ret?=?(long)(TEMP_BYTE_ARRAY[CURRENT_POSITION]?<<?24?|?TEMP_BYTE_ARRAY[CURRENT_POSITION?+?1]?<<?16?|?TEMP_BYTE_ARRAY[CURRENT_POSITION?+?2]?<<?8?|?TEMP_BYTE_ARRAY[CURRENT_POSITION?+?3]);
????????????CURRENT_POSITION?
+=?4;
????????????
return?ret;
????????}


????????
/**////?<summary>
????????
///?從ByteBuffer的當前位置彈出長度為Length的Byte數組,提升Length位
????????
///?</summary>
????????
///?<param?name="Length">數組長度</param>
????????
///?<returns>Length長度的byte數組</returns>

????????public?byte[]?PopByteArray(int?Length)
????????
...{
????????????
//溢出
????????????if?(CURRENT_POSITION?+?Length?>=?CURRENT_LENGTH)
????????????
...{
????????????????
return?new?byte[0];
????????????}

????????????
byte[]?ret?=?new?byte[Length];
????????????Array.Copy(TEMP_BYTE_ARRAY,?CURRENT_POSITION,?ret,?
0,?Length);
????????????
//提升位置
????????????CURRENT_POSITION?+=?Length;
????????????
return?ret;
????????}


????}

}

?????????? 由于實際需要我是要從byteArray中從左到右取數據,所以才定義了一個CURRENT_POSITION的變量,如果需要從右到左彈數據并減小Buffer的長度則直接用 --CURRENT_LENGTH就可以了

轉載于:https://www.cnblogs.com/anbylau2130/p/3233207.html

總結

以上是生活随笔為你收集整理的C#实现ByteBuffer类 .的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。