C++笔记之字节数组的处理
code review!
文章目录
- C++笔记之字节数组的处理
- 1.字节数组打印
- 2.将字节数组转换为十六进制字符串并打印
- 3.将字符串转为字节数组
- 4.将字节数组转为字符串
- 5.字节数组和字符数组的区别
- 6.字节数组用于二进制数据存储
- 7.字节数组用于网络通信数据传输
- 8.使用 unsigned char 来操作字节数据
- 9.字节数组和二进制字节流
- 10.使用memcpy和memset操作字节数组
1.字节数组打印
运行
代码
#include <iostream>
#include <vector>int main() {std::vector<unsigned char> byteArray = {0x01, 0x02, 0x03};for (unsigned char byte : byteArray) {std::cout << "Byte: " << static_cast<int>(byte) << std::endl;}return 0;
}
2.将字节数组转换为十六进制字符串并打印
运行
代码
#include <iomanip>
#include <iostream>
#include <sstream>
#include <vector>std::string ByteArrayToHexString(const std::vector<unsigned char> &byteArray) {std::stringstream ss;ss << std::hex << std::setfill('0');for (unsigned char byte : byteArray) {ss << std::setw(2) << static_cast<int>(byte);}return ss.str();
}int main() {std::vector<unsigned char> byteArray = {0x01, 0x02, 0x03};std::string hexString = ByteArrayToHexString(byteArray);std::cout << "Hex String: " << hexString << std::endl;return 0;
}
3.将字符串转为字节数组
运行
代码
#include <iostream>
#include <vector>
#include <string>int main() {std::string inputString = "Hello, Byte Data!";std::vector<unsigned char> byteArray(inputString.begin(), inputString.end());std::cout << "Byte from String: ";for (unsigned char byte : byteArray) {std::cout << static_cast<int>(byte) << " ";}std::cout << std::endl;return 0;
}
4.将字节数组转为字符串
运行
代码
#include <iostream>
#include <vector>
#include <string>int main() {std::vector<unsigned char> byteArray = {72, 101, 108, 108, 111, 44, 32, 66, 121, 116, 101, 32, 68, 97, 116, 97, 33};std::string str(byteArray.begin(), byteArray.end());std::cout << "String from Byte Array: " << str << std::endl;return 0;
}
5.字节数组和字符数组的区别
字节数组和字符数组都是一种用于存储一系列数据的数据结构,但它们在数据类型和使用上有一些区别:
-
数据类型:
- 字节数组(
std::vector<unsigned char>
):字节数组是一个存储无符号字符(字节)的动态数组。每个元素通常代表一个字节,其取值范围是0到255。 - 字符数组(C-style字符数组,例如
char[]
或char*
):字符数组是一组按照C字符串规则存储的字符,通常以空字符'\0'
结尾。
- 字节数组(
-
数据内容:
- 字节数组:可以存储任意字节数据,包括二进制数据和整数值的字节表示。
- 字符数组:主要用于存储文本数据,其中每个字符表示一个文本字符。
-
用途:
- 字节数组:通常用于处理二进制数据、字节流、网络通信等场景,如在通信协议中传递数据。
- 字符数组:主要用于处理文本数据,如C语言中的字符串操作,以及在文本处理、文件读写等场景。
-
表示结束:
- 字节数组:不需要以特定的值结尾,可以存储任意长度的字节数据。
- 字符数组:通常需要以空字符
'\0'
结尾,作为字符串的结束标志。
总之,字节数组适用于处理通用的二进制数据,而字符数组主要用于处理文本数据。在C++中,字节数组可以使用std::vector<unsigned char>
来表示,而字符数组可以使用C风格的字符数组(char[]
)或C++中的std::string
来表示。
6.字节数组用于二进制数据存储
7.字节数组用于网络通信数据传输
8.使用 unsigned char 来操作字节数据
运行
代码
#include <iostream>int main() {unsigned char byteValue = 0xAB; // 1010 1011 in binarystd::cout << "Byte Value: " << static_cast<int>(byteValue) << std::endl;// 检查特定位是否设置bool isBitSet = (byteValue & (1 << 3)) != 0;std::cout << "Bit 3 is set: " << std::boolalpha << isBitSet << std::endl;// 设置特定位byteValue |= (1 << 4); // Set bit 4std::cout << "Modified Byte Value: " << static_cast<int>(byteValue) << std::endl;return 0;
}
9.字节数组和二进制字节流
字节数组和二进制字节流都是用于存储和处理字节数据的概念,但它们可能在上下文中有不同的含义。
字节数组:
字节数组是一种数据结构,它表示一系列连续的字节。在C++中,通常使用 std::vector<unsigned char>
来表示字节数组。字节数组可以存储任意类型的字节数据,包括文本字符、整数、二进制数据等。字节数组中的每个元素通常代表一个字节,取值范围是0到255。字节数组可以用于处理通用的二进制数据,例如在网络通信、文件IO、数据序列化和反序列化等方面。
以下是一个表示字节数组的简单示例:
#include <iostream>
#include <vector>int main() {std::vector<unsigned char> byteArray = {0x41, 0x42, 0x43, 0x44};for (unsigned char byte : byteArray) {std::cout << "Byte: " << static_cast<int>(byte) << std::endl;}return 0;
}
二进制字节流:
二进制字节流是由一系列字节组成的数据流,其中每个字节可以取0到255范围内的整数值。二进制字节流通常用于在计算机系统之间传输数据,或在文件中存储数据。它主要关注数据的字节表示,而不将数据解释为文本字符。二进制字节流可以包含任何类型的数据,包括图像、音频、视频、文档等。
以下是一个简单的示例,演示了一个二进制字节流的概念:
#include <iostream>
#include <fstream>
#include <vector>int main() {std::vector<unsigned char> byteStream = {0x41, 0x42, 0x43, 0x44};std::ofstream outputFile("binary_stream.bin", std::ios::binary);if (outputFile.is_open()) {outputFile.write(reinterpret_cast<char*>(&byteStream[0]), byteStream.size());outputFile.close();std::cout << "Binary stream written to file." << std::endl;} else {std::cerr << "Unable to open file for writing." << std::endl;}return 0;
}
在此示例中,我们将一个字节数组写入一个二进制文件中,形成了一个二进制字节流。请注意,这只是一个简化的示例,实际应用中可能需要更多的处理和容错机制。
10.使用memcpy和memset操作字节数组
运行
代码
#include <cstring>
#include <iostream>int main() {// 创建一个源字节数组unsigned char sourceArray[] = {0x01, 0x02, 0x03, 0x04, 0x05};// 创建一个目标字节数组,与源数组大小相同unsigned char targetArray[sizeof(sourceArray)];// 使用 memcpy 拷贝数据std::memcpy(targetArray, sourceArray, sizeof(sourceArray));// 打印目标字节数组内容std::cout << "Target Array after memcpy:" << std::endl;for (unsigned char byte : targetArray) {std::cout << static_cast<int>(byte) << " ";}std::cout << std::endl;// 使用 memset 将目标字节数组填充为特定值std::memset(targetArray, 0xFF, sizeof(targetArray));// 打印目标字节数组内容std::cout << "Target Array after memset:" << std::endl;for (unsigned char byte : targetArray) {std::cout << static_cast<int>(byte) << " ";}std::cout << std::endl;return 0;
}