DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

 工作的时候遇到一个问题,需要把一个存储二进制网络流的buff转化为一个字符串进行存储。在网上搜了半天看到的方法都比较复杂。
在这里介绍一种自己认为比较简便的方法。
    二进制网络流一般都是unsigned  char类型。跟char的区别在于读取的方式不同,但是存储
的位数并没有什么不同。假设unsigned  char  Buff[] 里存储了二进制的网络流,在这里我们可以先使用char *NewBuff = (char*)Buff进行强制转换。
接下来就是由字符串转化为string就可以了。但是有个问题,在生成string的时候,string会复制buff中的字符直到遇到\0 的字符。
大家可以来看看构造一个string的代码实现:

  1. inline String::String(const char* str)     
  2. {  
  3.     if(!str)m_data=0;      //声明为inline函数,则该函数在程序中被执行时是语句直接替换,而不是被调用  
  4.     else {  
  5.         m_data=new char[strlen(str)+1];  
  6.         strcpy(m_data,str);  
  7.     }  

传入的buf会由strlen来计算长度,我们再来看看strlen的实现:
int strlen(const char *str)
{
    assert(str != NULL);
    int len = 0;
    while((*str++) != '\0') 
        len++; 
    return len;
}
大家可以看到,strlen遇到\0 就认为字符已经到结尾了。假设我们的Buff 存储的网络流里头包含\0,那么NewBuff被strlen
计算长度的时候,遇到\0就停止了。导致Buff在\0后面的字符都没有计算在内,最后生成的字符串就是\0前面的部分,这就造成了
信息丢失。在这里我们需要在处理网络收包的时候通过某些方法知道我们这个buff的长度,然后调用string::assign(char*,size_t n)
指定buff拷贝的长度,这样子buff中的内容都会被拷贝到string里头。不会造成数据的丢失。将string取出来再进行逆向的
转换就可以了。大家可以验证下。

posted on   DoubleLi  阅读(1240)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2022-06-07 代理服务器客户端Proxifier使用教程 Proxifier图文设置
2018-06-07 利用cbmakegen导出Code::blocks的Makefile
2016-06-07 linux下如何获取某一进程占用的物理内存和虚拟内存
2016-06-07 linux下如何获取每个线程的CPU占用率
2016-06-07 内存问题排查手段及相关文件介绍
2016-06-07 嵌入式/X86下linux系统死机及内存优化
2016-06-07 gcc指定头文件路径及动态链接库路径
点击右上角即可分享
微信分享提示