字节-4.char/unsigned char/string对比

在处理字节或字节流的时候,经常会用到char/unsigned char/string,那么他们之间有何异同呢。下面简要概括一下。

char和unsigned char的区别

  1. char的取值范围是-128-127,ASCII码的取值范围也是0-127。所以char天然适配ASCII,所以一般用char来存储文本字符。
  2. unsigned char的取值范围是0-255,一般用来存储单字节的16进制数据。超过127的16进制,是无法打印出来的。
  3. 对于一个固定的16进制数据,如0xFF(255),用unsigned char接收和用char接收,没什么区别。因为他俩都是一个字节,底层二进制存储都是一样的。只是显示结果不一样,一个-1,一个255。所以,在读写二进制文件时,用char\[\]和unsigned char\[\]接收字节流是没问题的。

char str\[\]和字符串string区别

  1. 用char\[\]存储图片文件等二进制数据时,没有问题。但不能直接使用字符串函数读写其中数据。比如,想遍历二进制字节数组,不能用strlen。因为char\[\]作为"C风格的字符串"时,无法正确使用含\0的二进制数据(因为 C 库函数会被\0截断,遇到\0就结束)。正确方式,是指定固定长度,直接读取。如for(int i=0;i<65535;i++),而不是for(int i=0;i<str.strlen();i++)
  2. C++中的string是对char\[\]的封装,相当于char\[\],但又解决了C函数遇到\0就截断的问题。所以在C++中,直接使用string接收文本或二进制数据,一点问题没有。即便同时接收文本和二进制数据,也没问题。比如发送图片二进制时,前面部分字节用文本表示、后面部分用二进制表示。接收方收到后,按先文本后二进制方式解析即可。
  3. 除了char\[\]和string外,直接用std::vector<char>存储二进制数据也是可以的,和string一样。
相关推荐
lazy H13 小时前
【计算机网络】第 13 篇:NAT 和端口映射是什么?为什么本地服务外网访问不了?
java·网络·网络协议·学习·计算机网络·408
lazy H2 天前
【计算机网络】第 12 篇:IPv6 详解——地址格式、地址类型与双栈网络
网络·经验分享·后端·学习·计算机网络·408
承渊政道4 天前
Linux网络学习【从深入理解网络层原理到IP分片与重组全过程剖析】
linux·计算机网络·ubuntu·ip分片与重组
局部有解4 天前
计算机网络:概论知识点整理
计算机网络
KobeSacre5 天前
计算机网络概览
网络·计算机网络
流浪0016 天前
计算机网络篇8:传输层——序列化与反序列化,TCP 面向字节流的报文边界由应用层自己切
网络协议·tcp/ip·计算机网络·1024程序员节·序列化反序列化·面向字节流·面向数据包
lazy H6 天前
【计算机网络】第 5 篇:TCP 和 UDP 有什么区别?从 Java 后端场景理解两种传输协议
经验分享·后端·网络协议·tcp/ip·计算机网络·1024程序员节
2501_915106326 天前
跨平台抓包工具怎么选?TraceEagle抓包鹰 的四种跨平台能力
网络协议·计算机网络·网络安全·ios·adb·https·udp
流浪0017 天前
计算机网络篇7:传输层——TCP 网络编程常用接口与调用流程
网络协议·tcp/ip·计算机网络·listen·tcp接口