C++笔记之字节数组的处理

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.字节数组和字符数组的区别

字节数组和字符数组都是一种用于存储一系列数据的数据结构,但它们在数据类型和使用上有一些区别:

  1. 数据类型:

    • 字节数组(std::vector<unsigned char>):字节数组是一个存储无符号字符(字节)的动态数组。每个元素通常代表一个字节,其取值范围是0到255。
    • 字符数组(C-style字符数组,例如char[]char*):字符数组是一组按照C字符串规则存储的字符,通常以空字符 '\0' 结尾。
  2. 数据内容:

    • 字节数组:可以存储任意字节数据,包括二进制数据和整数值的字节表示。
    • 字符数组:主要用于存储文本数据,其中每个字符表示一个文本字符。
  3. 用途:

    • 字节数组:通常用于处理二进制数据、字节流、网络通信等场景,如在通信协议中传递数据。
    • 字符数组:主要用于处理文本数据,如C语言中的字符串操作,以及在文本处理、文件读写等场景。
  4. 表示结束:

    • 字节数组:不需要以特定的值结尾,可以存储任意长度的字节数据。
    • 字符数组:通常需要以空字符 '\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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/63793.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

邵阳人自己的民国风情街终于来了!随手一拍即是大片!

在邵阳这座美丽的城市&#xff0c;拥有许多非常有意思并且值得打卡的游玩景区&#xff0c;“丹霞之魂&#xff0c;国之瑰宝”的崀山、“南方呼伦贝尔”之称的高山苔地草原、被联合国誉为“神奇绿洲”的遂宁黄桑等等都是成都这座城市的代表&#xff0c;但在邵阳最有民国风情韵味…

SQL | 注释

2-注释 2.1-单行注释 select prod_name -- 这是一条行内注释 from products; 使用两个连字符(-- ) 放在行内&#xff0c;两个连字符后的内容即为注释内容。 # 这是一条注释 select prod_name from products; 这种注释方式可能有些数据库不支持&#xff0c;所以使用前应该…

【Kafka】1.Kafka简介及安装

目 录 1. Kafka的简介1.1 使用场景1.2 基本概念 2. Kafka的安装2.1 下载Kafka的压缩包2.2 解压Kafka的压缩包2.3 启动Kafka服务 1. Kafka的简介 Kafka 是一个分布式、支持分区&#xff08;partition&#xff09;、多副本&#xff08;replica&#xff09;、基于 zookeeper 协调…

【CSH 入门基础 5 -- csh 文件监控脚本实现】

文章目录 背景CSHLL 代码实现cshell 中 unset 的介绍bash 中监控文件的方法 背景 由于开发代码是在外网编译&#xff0c;而镜像的烧写是在内网中的EDA工具中进行的&#xff0c;所以就需要先将代码在外网编译好后&#xff0c;再通过FTP工具将镜像传输到内网中&#xff0c;然后在…

Android FrameWork 层 Handler源码解析

Handler生产者-消费者模型 在android开发中&#xff0c;经常会在子线程中进行一些耗时操作&#xff0c;当操作完毕后会通过handler发送一些数据给主线程&#xff0c;通知主线程做相应的操作。 其中&#xff1a;子线程、handler、主线程&#xff0c;其实构成了线程模型中经典的…

neo4j查询语言Cypher详解(二)--Pattern和类型

Patterns 图形模式匹配是Cypher的核心。它是一种用于通过应用声明性模式从图中导航、描述和提取数据的机制。在MATCH子句中&#xff0c;可以使用图模式定义要搜索的数据和要返回的数据。图模式匹配也可以在不使用MATCH子句的情况下在EXISTS、COUNT和COLLECT子查询中使用。 图…

Spring Boot+Mybatis实现增删改查接口开发+测试(超详细建议收藏)

前言 Java也是测试必知必会的内容&#xff0c;特别是现在类似spring boot 等Java框架更是成为主流。之前实现的图书增删改查是用Python实现的&#xff0c;没看过的请移步&#xff1a;Flaskmysql 实现增删改查接口开发测试&#xff08;图文教程附源码&#xff09;&#xff0c;本…

redis学习笔记(八)

文章目录 redis的配置redis的核心配置选项Redis的使用 redis的配置 cat /etc/redis/redis.confredis 安装成功以后,window下的配置文件保存在软件 安装目录下,如果是mac或者linux,则默认安装/etc/redis/redis.conf redis的核心配置选项 绑定ip&#xff1a;访问白名单&#x…

AP51656 电流采样降压恒流驱动IC RGB PWM深度调光 LED电源驱动

产品描述 AP51656是一款连续电感电流导通模式的降压恒流源&#xff0c;用于驱动一颗或多颗串联LED 输入电压范围从 5 V 到 60V&#xff0c;输出电流 可达 1.5A 。根据不同的输入电压和 外部器件&#xff0c; 可以驱动高达数十瓦的 LED。 内置功率开关&#xff0c;采用电流采样…

【Spring Boot】夺名连环问(持续更新ing)

Spring的了解与特性 简单介绍&#xff1a;快速开发Spring项目的脚手架。简化Spring应用的初始搭建以及开发过程。 特性 提供了很多内置的Starter结合自动配置&#xff0c;对主流框架的无配置集成、开箱即用。即不需要自己去引入很多依赖。 并且管理了常用的第三方依赖的版本&…

冒泡排序(超详细!)(C语言)

大家好&#xff01;欢迎来到Mr.kanglong的CSDN博文&#xff0c;今天来讨论一下冒泡排序&#xff0c;在百度百科中&#xff0c;关于为什么叫冒泡排序是这样解释的&#xff1a;因为越小的元素会经由交换慢慢“浮”到数列的顶端&#xff08;升序或降序排列&#xff09;&#xff0c…

软件测试工程师面试如何描述自动化测试是怎么实现的?

软件测试工程师面试的时候&#xff0c;但凡简历中有透露一点点自己会自动化测试的技能点的描述&#xff0c;都会被面试官问&#xff0c;那你结合你的测试项目说说自动化测试是怎么实现的&#xff1f;一到这里&#xff0c;很多网友&#xff0c;包括我的学生&#xff0c;也都一脸…