一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 如何在C++中實現按位存取

如何在C++中實現按位存取

2021-03-04 10:27VeiwoZouhui C/C++

實現緊湊存取,不是按一個字節一個字節地存取,而是按位存取,本文就是介紹了如何在C++中實現按位存取,需要的朋友可以參考下

在我創業的一個項目中,為了節約網絡帶寬,因此在網絡中傳輸數據需要實現緊湊存取,在國防,科研,航天,軍工等多個領域其實也有類似的需求。
實現緊湊存取,不是按一個字節一個字節地存取,而是按位存取。比如一個字節,我們可以存儲8個bool信息,廢話少說,直接分享代碼(備注:里面的代碼算法值得優化)。

//以下為函數定義 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/***********************************************************************/
/*  函數作用:從buffer讀一個位                    */
/*  參數pBuffer[in]:指定buffer                    */
/*  參數nStart[in]:指定位置                     */
/*  參數nEnd[out]:返回結束位置                    */
/*  參數retByte[out]:返回讀取結果值                 */
/*  返回:void                              */
/***********************************************************************/
void ReadOneBit( byte* pBuffer, int nStart, /* out */int& nEnd, /* out */ byte& retByte );
 
/***********************************************************************/
/*  函數作用:從指定buffer里讀任意一段位置數據            */
/*  參數pBuffer[in]:指定buffer                    */
/*  參數nStart[in]:指定位置                     */
/*  參數btLength[in]:讀取長度                    */
/*  參數nEnd[out]:返回結束位置                    */
/*  參數retData[out]:返回讀取結果值,支持任意數據類型        */
/*  返回:void                              */
/***********************************************************************/
template<typename T>
void ReadDataFromBuffer( byte* pBuffer, int nStart, byte btLength, /* out */int& nEnd, /* out */ T& retData );
 
/***********************************************************************/
/*  函數作用:從指定buffer里讀取一段字符串              */
/*  參數pBuffer[in]:指定buffer                    */
/*  參數nStart[in]:指定位置                     */
/*  參數nCount[in]:字符串長度                    */
/*  參數nEnd[out]:返回結束位置                    */
/*  參數pRetData[out]:返回讀取字符串結果               */
/*  返回:void                              */
/***********************************************************************/
void ReadStringFromBuffer( byte* pBuffer, int nStart, int nCount, /* out */int& nEnd, /* out */char* pRetData );
 
 
 
/***********************************************************************/
/*  函數作用:向buffer寫一個位                    */
/*  參數pBuffer[in]:指定buffer                    */
/*  參數btData[in]:需要寫入的值                   */
/*  參數nStart[in]:指定位置                     */
/*  參數nEnd[out]:返回結束位置                    */
/*  返回:void                              */
/***********************************************************************/
void WriteOneBit( byte* pBuffer, byte btData, int nStart, /* out */int& nEnd );
 
/***********************************************************************/
/*  函數作用:向指定buffer里寫入任意一段數據             */
/*  參數pBuffer[in]:指定buffer                    */
/*  參數tData[in]:需要寫入的數據,支持任意數據類型          */
/*  參數nStart[in]:指定位置                     */
/*  參數btLength[in]:讀取長度                    */
/*  參數nEnd[out]:返回結束位置                    */
/*  返回:void                              */
/***********************************************************************/
template<typename T>
void WriteDataToBuffer( byte* pBuffer, T tData, int nStart, byte btLength, /* out */int& nEnd );
 
/***********************************************************************/
/*  函數作用:向指定buffer里寫取一段字符串              */
/*  參數pBuffer[in]:指定buffer                    */
/*  參數pchar[in]:需要寫入的字符串                  */
/*  參數nStart[in]:指定位置                     */
/*  參數nCount[in]:字符串長度                    */
/*  參數nEnd[out]:返回結束位置                    */
/*  返回:void                              */
/***********************************************************************/
void WtriteStringToBuffer( byte* pBuffer, char* pchar, int nStart, int nCount, /* out */int& nEnd );

 

//以下為函數實現

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
void ReadOneBit( byte* pBuffer, int nStart, /* out */int& nEnd, /* out */ byte& retByte )
{
  byte btData = pBuffer[nStart/8];
  btData = btData << nStart%8;
  retByte = btData >> 7;
  nEnd = nStart+1;
}
 
template<typename T>
void ReadDataFromBuffer( byte* pBuffer, int nStart, byte btLength, /* out */int& nEnd, /* out */ T& retData )
{
  //順序讀位
  retData = 0;
  if ( btLength > sizeof(T)*8 )
    return ;
   
  byte btData;
  T tData;
  while ( btLength-- )
  {
    ReadOneBit(pBuffer, nStart, nStart, btData);
    tData = btData << btLength;
    retData |= tData;
  }
   
  nEnd = nStart;
}
 
void ReadStringFromBuffer( byte* pBuffer, int nStart, int nCount, /* out */int& nEnd, /* out */char* pRetData )
{
  for ( int nIndex=0; nIndex<nCount; nIndex++ )
  {
    ReadDataFromBuffer(pBuffer, nStart, 8, nStart, pRetData[nIndex]);
  }
  nEnd = nStart;
}
 
 
void WriteOneBit( byte* pBuffer, byte btData, int nStart, /* out */int& nEnd )
{
  int nSet = nStart / 8;
  byte c = pBuffer[nSet];
  switch ( btData )
  {
  case 1:
    c |= ( 1 << (7- nStart % 8) );
    break;
  case 0:
    c &= ( ~(1 << (7- nStart % 8) ) );
    break;
  default:
    return;
  }
  pBuffer [nSet] = c;
  nEnd = nStart +1;
}
 
 
 
template<typename T>
void WriteDataToBuffer( byte* pBuffer, T tData, int nStart, byte btLength, /* out */int& nEnd )
{
/* //大端機模式
  byte btDataLength = sizeof(T);
  if ( btLength > sizeof(T)*8 )
    return;
   
  int nDataStart = 0; //數據的第一位位置為0,順序寫入
  while ( btLength-- )
  {
    byte bitData;
    ReadOneBit((byte*)&tData, nDataStart, nDataStart, bitData);
    WriteOneBit(pBuffer, bitData, nStart, nStart);
  }
   
  nEnd = nStart;
*/
 
  //小端機模式:寫buffer的時候,不能順序寫位
 
  //獲得模版占用字節大小
  byte btDataLength = sizeof(T);
 
  //校驗長度是否越界
  if ( btLength > sizeof(T)*8 )
    return;
 
  //將待寫數據轉為byte*
  byte* ptData = (byte*)&tData; 
 
  //求模與余
  int nSet = btLength / 8;
  int nRin = btLength % 8;
   
  //定義字節數據與位數據
  byte bitData;
  byte byteData;
  int nTempEnd;
 
  //先寫rin數據
  byteData = ptData[nSet];
  while ( nRin-- )
  {
    ReadOneBit(&byteData, 7-nRin, nTempEnd, bitData);
    WriteOneBit(pBuffer, bitData, nStart, nStart);
  }
 
  //再寫Set數據
  while ( nSet )
  {
    byteData = ptData[--nSet];
    //寫一個byte
    int i=0;
    while ( i!=8 )
    {
      ReadOneBit(&byteData, i++, nTempEnd, bitData);
      WriteOneBit(pBuffer, bitData, nStart, nStart);
    }
  }
  nEnd = nStart;
 
}
 
 
void WtriteStringToBuffer( byte* pBuffer, char* pchar, int nStart, int nCount, /* out */int& nEnd )
{
  for ( int nIndex=0; nIndex<nCount; nIndex++ )
  {
    WriteDataToBuffer(pBuffer, pchar[nIndex], nStart, 8, nStart);
  }
  nEnd = nStart;
}

以上就是本文的全部內容,希望對大家的學習有所幫助。

延伸 · 閱讀

精彩推薦
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
主站蜘蛛池模板: 白鹿扒开内裤露出尿孔 | 色姑娘导航 | 亚洲精品久久啪啪网站成年 | 欧美日韩一区二区三在线 | 免费视频一级片 | 国产第一综合另类色区奇米 | 成人欧美一区二区三区黑人 | 国产成人夜色影视视频 | 精品日韩二区三区精品视频 | 欧美亚洲国产精品久久第一页 | 亚洲AV久久久久久久无码 | 成人免费在线视频网 | 日本xxxxx69hd日本 | 亚洲国产成人久久综合区 | 天天插在线视频 | 欧美bbb人妖| 色婷丁香| 99热在线精品播放 | 男生同性啪视频在线观看 | 国产成人影院一区二区 | 午夜久久久久久亚洲国产精品 | 国色天香社区视频免费高清在线观看 | 亚洲精品久久久打桩机 | 午夜福利理论片高清在线 | 女教师巨大乳孔中文字幕免费 | 极品奶妈漫画 | 成年人视频免费在线观看 | 99热在线精品播放 | 九九九九九热 | 成人特级毛片69免费观看 | 67194在线免费观看 | 91制片厂制作果冻传媒2021 | 草莓绿巨人香蕉茄子芭乐 | 亚洲一区二区日韩欧美gif | 精品国产乱码久久久久久免费流畅 | 操尼姑| 亚洲国产成人99精品激情在线 | 性直播免费 | 小柔的性放荡羞辱日记 | 日韩久久精品 | 成人国产在线观看 |