栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

如何在C++中实现按位存取

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在C++中实现按位存取

在我创业的一个项目中,为了节约网络带宽,因此在网络中传输数据需要实现紧凑存取,在国防,科研,航天,军工等多个领域其实也有类似的需求。
实现紧凑存取,不是按一个字节一个字节地存取,而是按位存取。比如一个字节,我们可以存储8个bool信息,废话少说,直接分享代码(备注:里面的代码算法值得优化)。

//以下为函数定义 

 
 
 
 
 
 
 
 
void ReadoneBit( byte* pBuffer, int nStart, int& nEnd,  byte& retByte ); 
 
 
 
 
 
 
 
 
 
 
template 
void ReadDataFromBuffer( byte* pBuffer, int nStart, byte btLength, int& nEnd,  T& retData ); 
 
 
 
 
 
 
 
 
 
 
void ReadStringFromBuffer( byte* pBuffer, int nStart, int nCount, int& nEnd, char* pRetData ); 
 
 
 
 
 
 
 
 
 
 
 
void WriteoneBit( byte* pBuffer, byte btData, int nStart, int& nEnd ); 
 
 
 
 
 
 
 
 
 
 
template 
void WriteDataToBuffer( byte* pBuffer, T tData, int nStart, byte btLength, int& nEnd ); 
 
 
 
 
 
 
 
 
 
 
void WtriteStringToBuffer( byte* pBuffer, char* pchar, int nStart, int nCount, int& nEnd ); 


//以下为函数实现

void ReadoneBit( byte* pBuffer, int nStart, int& nEnd,  byte& retByte ) 
{ 
  byte btData = pBuffer[nStart/8]; 
  btData = btData << nStart%8; 
  retByte = btData >> 7; 
  nEnd = nStart+1; 
} 
 
template 
void ReadDataFromBuffer( byte* pBuffer, int nStart, byte btLength, int& nEnd,  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, int& nEnd, char* pRetData ) 
{ 
  for ( int nIndex=0; nIndex 
void WriteDataToBuffer( byte* pBuffer, T tData, int nStart, byte btLength, int& nEnd ) 
{ 
 
 
  //小端机模式:写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, int& nEnd ) 
{ 
  for ( int nIndex=0; nIndex

以上就是本文的全部内容,希望对大家的学习有所帮助。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/65006.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号