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

news2025/1/15 22:58:36

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 binary

    std::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 4

    std::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.coloradmin.cn/o/869491.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【字节跳动青训营】后端笔记整理-2 | Go实践记录:猜谜游戏,在线词典,Socks5代理服务器

**本人是第六届字节跳动青训营&#xff08;后端组&#xff09;的成员。本文由博主本人整理自该营的日常学习实践&#xff0c;首发于稀土掘金&#xff1a;&#x1f517;Go实践记录&#xff1a;猜谜游戏&#xff0c;在线词典&#xff0c;Socks5代理服务器 | 青训营 我的go开发环境…

群晖7.X版安装cpolar内网穿透

群晖7.X版安装cpolar内网穿透套件 文章目录 群晖7.X版安装cpolar内网穿透套件前言1. 下载cpolar的群晖系统套件1.1 在“套件中心” 选择“手动安装”1.2 完成套件安装 2. 进入cpolar软件信息页3. 点击“免费注册”轻松获得cpolar账号 前言 随着群晖系统的更新换代&#xff0c;…

第一百二十七天学习记录:我的创作纪念日

机缘 今天收到CSDN官方的来信&#xff0c;想想也可以对我前面的学习记录进行一个总结。 关于来到CSDN的初心&#xff0c;也就是为了让自己养成一个良好的学习总结的习惯。这里要感谢我C语言视频教程的老师&#xff0c;是他建议学生们在技术博客中进行记录。对于技术博客&…

【Plex】FRP内网穿透后 App无法使用问题

能搜索到这个文章的&#xff0c;应该都看过这位同学的分析【Plex】FRP内网穿透后 App无法使用问题_plex frp无效_Fu1co的博客-CSDN博客 这个是必要的过程&#xff0c;但是设置之后仍然app端无法访问&#xff0c;原因是因为网络端口的问题 这个里面的这个公开端口&#xff0c;可…

EVE-NG MPLS L2VPN BGP lsp

导入了新的H3C 镜像&#xff0c;bgp 正常了。 目录 1 拓扑 2 配置步骤 2.1 配置接口IP 和路由协议 2.2 配置MPLS LDP 2.3 配置L2VPN BGP 2.4 配置 xconnect-group 2.5 验证L2VPN 1 拓扑 2 配置步骤 2.1 配置接口IP 和路由协议 PE1 interface LoopBack 0ip address 1…

LNMP环境搭建wordpress以及跳转后台报404解决

基于上文配置好的LNMP环境继续搭建wordpress 目录 一.到官网下载tar.gz包&#xff0c;并上传到Linux上&#xff0c;也可以通过复制链接地址进行下载 二. 将wordpress中的所有文件移动到你nginx.conf中指定目录中 三.为wordpress配置数据库 四.到浏览器进行注册 1.刚开始…

使用QT纯代码创建(查找)对话框详细步骤与代码

一、创建项目文件 打开Qt Creator->文件->新建文件或项目->选择Qt Widgets Application 为项目起名字 输入类的名字 二、 了解每个文件的作用 项目创建完毕之后就会出现以下几个文件&#xff0c;先来分别介绍以下这些文件的作用。 Headers->finddialog.h——很显…

Java:函数式(Functional)接口

文章目录 1 什么是函数式接口2 如何理解函数式接口3 举例Java 内置函数式接口1 之前的函数式接口2 四大核心函数式接口3.4.3 其它接口 内置接口代码演示 5 练习 1 什么是函数式接口 只包含一个抽象方法&#xff08;Single Abstract Method&#xff0c;简称SAM&#xff09;的接…

虚拟机/双系统Ubuntu扩容

虚拟机Ubuntu扩容 1.需要删除所有的快照 2.扩展虚拟机磁盘大小 虚拟机(M)→设置(s)→硬盘(SCSI)→扩展磁盘容量 3.Ubuntu内调整分区大小 安装gparted分区工具&#xff1a;sudo apt-get install gparted 启动gparted并resize分区 4.最后最好建一个快照&#xff0c;不然gg了…

系统架构设计专业技能 · 计算机网络(三)【系统架构设计师】

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估&#xff08;二&#xff09;【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…

【FPGA零基础学习之旅#10】按键消抖模块设计与验证(一段式状态机实现)

&#x1f389;欢迎来到FPGA专栏~按键消抖模块设计与验证 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大…

Android应用开发(37)LTPO帧率测试基于Surfaceview(暂存)

Android应用开发学习笔记——目录索引 参考android官网&#xff1a; Frame rate | Android media | Android Developers多重刷新率 | Android 开源项目 | Android Open Source ProjectWindowManager.LayoutParams | Android Developers 目前市面上旗舰手机基本都是…

wangEditor5实现@评论功能

需求描述&#xff1a;在输入框输入后显示用户列表&#xff0c;实现人功能 当前环境&#xff1a;vue3viteelementPluswangEditor5 需要插件&#xff1a;wangeditor/plugin-mention 安装插件&#xff1a;npm i wangeditor/plugin-mention 输入框组件分两部分&#xff1a;1. wa…

【electron】electron安装过慢和打包报错:Unable to load file:

文章目录 一、安装过慢问题:二、打包报错&#xff1a;Unable to load file: 一、安装过慢问题: 一直处于安装过程 【解决】 #修改npm的配置文件 npm config edit#添加配置 electron_mirrorhttps://cdn.npm.taobao.org/dist/electron/二、打包报错&#xff1a;Unable to load…

CAS服务端入门使用实践

CAS服务端入门使用实践 一、前言 1.简介 CAS 是一个企业多语言单点登录解决方案&#xff0c;支持大量附加身份验证协议和功能&#xff0c;满足身份验证和授权需求的综合平台。 2.环境 Windows 10JDK 1.8git version 2.41.0.windows.3Tomcat 9.0.78Maven 3.5.3cas-overlay-…

类与对象(加深)

目录 1.类的6个默认成员函数 2. 构造函数 2.1 概念 2.2 特性 3.析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 5.赋值运算符重载 5.1 运算符重载 5.2 赋值运算符重载 6.const成员 7.取地址及const取地址操作符重载 1.类的6个默认成员函数 如果…

51.C++继承

今天进行了新的学习关于c继承的知识。 目录 1.继承 基类and派生类 访问控制和继承 单继承 多继承 2.同名隐藏 1.继承 在C中&#xff0c;继承是一种面向对象编程的重要特性&#xff0c;用于构建类之间的层次关系。通过继承&#xff0c;一个类可以从另一个类继承其…

QT网络编程之TCP

QT网络编程之TCP TCP 编程需要用到俩个类: QTcpServer 和 QTcpSocket。 #------------------------------------------------- # # Project created by QtCreator 2023-08-

2023-08-12 LeetCode每日一题(合并 K 个升序链表)

2023-08-12每日一题 一、题目编号 23. 合并 K 个升序链表二、题目链接 点击跳转到题目位置 三、题目描述 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 示例 2&…

String(字符串)

1、String概述 java.lang.String类代表字符串&#xff0c;Java程序中的所有字符串文字&#xff08;例如“abc”&#xff09;都为此类的对象。 1.1、String的注意点 字符串的内容是不会发生改变的&#xff0c;它的对象在创建后不能被更改。 1.2、总结 String是Java定义好的一个类…