C++与Android处理16进制大端/小端数据实例(二百七十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门实战课原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

🍉🍉🍉文章目录🍉🍉🍉

    • 🌻1.前言
    • 🌻2.大小端介绍
      • 🐓2.1 大端模式
      • 🐓2.2 小端模式
      • 🐓2.3 作用及应用
      • 🐓2.4结论
    • 🌻3.代码实例
      • 🐓3.1 C++处理大端、小端数据
      • 🐓3.2 Android处理大端、小端数据
      • 🐓3.3 C语言处理大端、小端数据

🌻1.前言

本篇目的:C++与Android处理16进制大端/小端数据实例

🌻2.大小端介绍

  • 大小端模式是指计算机系统中多字节数据的存储方式和传输方式,它主要分为大端模式(Big-Endian)和小端模式(Little-Endian)。

🐓2.1 大端模式

  • 在大端模式中,高字节存储在低地址位置,而低字节存储在高地址位置。换句话说,一个数的最高有效字节(Most Significant Byte, MSB)存放在内存的起始位置。大端模式的特点是数据的书写顺序与其在内存中的存储顺序一致,这样在查看内存时,数据看起来更直观。例如,对于一个32位整数0x12345678,在大端模式下的存储顺序如下:
地址   值
0x00   12
0x01   34
0x02   56
0x03   78

🐓2.2 小端模式

小端模式则是将低字节存储在低地址位置,高字节存储在高地址位置。即最低有效字节(Least Significant Byte, LSB)放在内存的起始位置。与大端模式相反,小端模式的数据存储顺序和书写顺序相反。例如,对于同样的32位整数0x12345678,在小端模式下的存储顺序如下:

地址   值
0x00   78
0x01   56
0x02   34
0x03   12

🐓2.3 作用及应用

  • 大小端模式的选择与计算机的体系结构和应用需求有关。不同的处理器体系结构可能会采用不同的字节存储方式。
  1. 网络通信:在网络通信中,大端模式(也称为网络字节序)被广泛采用。这是因为大端模式在数据传输时,最高有效字节先传输,便于数据在不同系统之间进行一致的传递和解释。互联网协议(如TCP/IP)就使用大端模式,这使得不同设备之间的数据交换更为统一和标准化。

  2. 跨平台数据处理:当程序需要在不同平台上运行时(例如在不同的处理器架构之间传递数据),了解并处理大小端模式是必要的。某些处理器(如x86架构)采用小端模式,而其他处理器(如某些RISC架构)可能采用大端模式。在这种情况下,程序需要正确地转换数据的字节顺序,以确保数据的一致性和正确性。

  3. 文件格式和数据存储:某些文件格式或数据存储协议可能规定了特定的字节序。例如,WAV音频文件和许多图像文件格式规定了使用小端模式存储数据。这种规定确保了文件在不同系统上读取时的一致性。

🐓2.4结论

  • 大小端模式是计算机系统中处理多字节数据的重要概念,理解和正确应用这些模式对于开发跨平台软件、网络协议和处理特定文件格式至关重要。
  • 大端模式以其直观的内存布局适用于网络通信和标准化的数据传输,而小端模式由于其在某些处理器上的效率优势,被广泛应用于多种处理器架构中。在实际应用中,根据具体需求选择合适的字节序模式是确保数据正确处理的关键。

🌻3.代码实例

🐓3.1 C++处理大端、小端数据

#include <iostream>
#include <iomanip>
#include <vector>
#include <cstdint>// 判断系统是否为小端
bool isLittleEndian() {uint16_t number = 0x1;return (*(char *)&number == 0x1);
}// 进行字节序转换(32位)
uint32_t swapEndian32(uint32_t val) {return ((val >> 24) & 0x000000FF) |((val >> 8) & 0x0000FF00) |((val << 8) & 0x00FF0000) |((val << 24) & 0xFF000000);
}// 打印缓冲区内容(小端字节序)
void printBufferLittleEndian(const std::vector<uint8_t>& buffer, const std::string& bufferName) {std::string bufferHex;for (size_t i = 0; i < buffer.size(); i += 4) {uint32_t val = 0;// 读取4个字节for (size_t j = 0; j < 4 && (i + j) < buffer.size(); ++j) {val |= (static_cast<uint32_t>(buffer[i + j]) << (j * 8));}// 如果系统不是小端字节序,则需要转换字节序if (!isLittleEndian()) {val = swapEndian32(val);}// 将4字节的值转换为十六进制字符串std::ostringstream hexStream;hexStream << std::setfill('0') << std::setw(8) << std::hex << val;bufferHex += hexStream.str() + " ";}std::cout << bufferName << ": " << bufferHex << std::endl;
}// 打印write_buffer的内容
void printWriteBuffer(const std::vector<uint8_t>& writeBuffer) {printBufferLittleEndian(writeBuffer, "Write Buffer");
}// 打印read_buffer的内容
void printReadBuffer(const std::vector<uint8_t>& readBuffer) {printBufferLittleEndian(readBuffer, "Read Buffer");
}int main() {// 初始化示例数据std::vector<uint8_t> writeBuffer(256);for (int i = 0; i < 256; ++i) {writeBuffer[i] = static_cast<uint8_t>(i);}std::vector<uint8_t> readBuffer(256);for (int i = 0; i < 256; ++i) {readBuffer[i] = static_cast<uint8_t>(255 - i);}// 打印缓冲区内容printWriteBuffer(writeBuffer);printf("\n");printReadBuffer(readBuffer);return 0;
}

🐓3.2 Android处理大端、小端数据

#include <cutils/log.h>
#include <iomanip>
#include <stdint.h>// 判断系统是否为小端
bool isLittleEndian() {uint16_t number = 0x1;return (*(char *)&number == 0x1);
}// 进行字节序转换(32位)
uint32_t swapEndian32(uint32_t val) {return ((val >> 24) & 0x000000FF) |((val >> 8) & 0x0000FF00) |((val << 8) & 0x00FF0000) |((val << 24) & 0xFF000000);
}// 打印缓冲区内容(小端字节序)
void printBufferLittleEndian(const char* buffer, size_t size, const char* bufferName) {std::string bufferHex;for (size_t i = 0; i < size; i += 4) {uint32_t val = 0;// 读取4个字节for (size_t j = 0; j < 4 && (i + j) < size; ++j) {val |= (static_cast<uint32_t>(static_cast<uint8_t>(buffer[i + j])) << (j * 8));}// 如果系统不是小端字节序,则需要转换字节序if (!isLittleEndian()) {val = swapEndian32(val);}// 将4字节的值转换为十六进制字符串char hex[9];snprintf(hex, sizeof(hex), "%08x", val);bufferHex += hex;bufferHex += " ";}ALOGE("%s: %s", bufferName, bufferHex.c_str());
}// 打印write_buffer的内容
void printWriteBuffer(const binder_write_read& bwr) {const char* writeBuffer = reinterpret_cast<const char*>(bwr.write_buffer);printBufferLittleEndian(writeBuffer, bwr.write_size, "Write Buffer");
}// 打印read_buffer的内容
void printReadBuffer(const binder_write_read& bwr) {const char* readBuffer = reinterpret_cast<const char*>(bwr.read_buffer);printBufferLittleEndian(readBuffer, bwr.read_size, "Read Buffer");
}int main() {binder_write_read bwr;// 初始化示例数据bwr.write_size = 256;char writeData[256];for (int i = 0; i < 256; ++i) {writeData[i] = i;}bwr.write_buffer = reinterpret_cast<binder_uintptr_t>(writeData);bwr.read_size = 256;char readData[256];for (int i = 0; i < 256; ++i) {readData[i] = 255 - i;}bwr.read_buffer = reinterpret_cast<binder_uintptr_t>(readData);// 打印缓冲区内容printWriteBuffer(bwr);printReadBuffer(bwr);return 0;
}

🐓3.3 C语言处理大端、小端数据

/***********************************************************
* Author        : 公众号: Android系统攻城狮
* Create time   : 2024-05-21 10:07:14 星期二
* Filename      : little_big_duan_for_C.cpp
* Description   :
************************************************************/#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdbool.h>// 判断系统是否为小端
bool isLittleEndian() {uint16_t number = 0x1;return (*(char *)&number == 0x1);
}// 进行字节序转换(32位)
uint32_t swapEndian32(uint32_t val) {return ((val >> 24) & 0x000000FF) |((val >> 8) & 0x0000FF00) |((val << 8) & 0x00FF0000) |((val << 24) & 0xFF000000);
}// 打印缓冲区内容(小端字节序)
void printBufferLittleEndian(const char* buffer, size_t size, const char* bufferName) {char bufferHex[1024] = {0}; // 假设缓冲区最大为1024字节char hex[9];for (size_t i = 0; i < size; i += 4) {uint32_t val = 0;// 读取4个字节for (size_t j = 0; j < 4 && (i + j) < size; ++j) {val |= (uint32_t)((uint8_t)buffer[i + j]) << (j * 8);}// 如果系统不是小端字节序,则需要转换字节序if (!isLittleEndian()) {val = swapEndian32(val);}// 将4字节的值转换为十六进制字符串snprintf(hex, sizeof(hex), "%08x", val);strncat(bufferHex, hex, sizeof(bufferHex) - strlen(bufferHex) - 1);strncat(bufferHex, " ", sizeof(bufferHex) - strlen(bufferHex) - 1);}printf("%s: %s\n", bufferName, bufferHex);
}// 假设binder_write_read_01结构如下
typedef struct {void* write_buffer;size_t write_size;void* read_buffer;size_t read_size;
} binder_write_read_01;// 打印write_buffer的内容
void printWriteBuffer(const binder_write_read_01* bwr) {const char* writeBuffer = (const char*)(bwr->write_buffer);printBufferLittleEndian(writeBuffer, bwr->write_size, "Write Buffer");
}// 打印read_buffer的内容
void printReadBuffer(const binder_write_read_01* bwr) {const char* readBuffer = (const char*)(bwr->read_buffer);printBufferLittleEndian(readBuffer, bwr->read_size, "Read Buffer");
}int main() {// 示例使用uint8_t write_data[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};uint8_t read_data[] = {0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10};binder_write_read_01 bwr = {write_data, sizeof(write_data), read_data, sizeof(read_data)};printWriteBuffer(&bwr);//printReadBuffer(&bwr);return 0;
}

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

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

相关文章

民国漫画杂志《时代漫画》第14期.PDF

时代漫画14.PDF: https://url03.ctfile.com/f/1779803-1247458399-6732ac?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络&#xff01;

OWASP top10--SQL注入(一)

SQL注入式攻击技术&#xff0c;一般针对基于Web平台的应用程序.造成SQL注入攻击漏洞的原因&#xff0c;是由于程序员在编写Web程序时&#xff0c;没有对浏览器端提交的参数进行严格的过滤和判断。用户可以修改构造参数&#xff0c;提交SQL查询语句&#xff0c;并传递至服务器端…

基本IO接口

引入 基本输入接口 示例1 示例2&#xff1a;有数据保持能力的外设 #RD端由in指令控制&#xff1a;将数据由端口传输到CPU内存中 #CS244信号由译码电路实现 示例3&#xff1a; a)图中由于输出端口6有连接到端口1&#xff0c;当开关与端点1闭合时期间&#xff0c;仍能维持3端口…

使用DataGrip连接Elasticsearch

使用DataGrip连接Elasticsearch 前言&#xff0c;公司需要使用ES来做数据的查询&#xff0c;我安装完ES&#xff0c;安装完Kibana的时候&#xff0c;想先开始尝试一下&#xff0c;插入查询数据能否可用&#xff0c;但是上次使用ES是好久前了&#xff0c;增删改查的请求根本记不…

欧拉函数、快速幂、扩展欧几里得算法、中国剩余定理和高斯消元

欧拉函数 给定 n 个正整数 ai&#xff0c;请你求出每个数的欧拉函数。 欧拉函数的定义1∼N 中与 N 互质的数的个数被称为欧拉函数&#xff0c;记为 ϕ(N)。 若在算数基本定理中&#xff0c;Np1a11p2a2…pmm&#xff0c;则&#xff1a;ϕ(N) Np1−1/p1p2−1/p2…pm−1/pm 输…

javas-core VS java-object-diff

对照工具选择 javas-core 和 java-object-diff ,对比demo https://github.com/kofgame/objectdiff-vs-javers&#xff0c;都为同源对比&#xff0c;都支持嵌套对象。 使用JMH测试方法进行性能测试&#xff0c;使用题库的QuestionResponseVO对象来进行对照对比&#xff0c;进行…

mac上简单实现一个java调用C接口的JNI

目录 安装JDK及配置环境变量写Java代码生成头文件实现本地方法编译本地代码运行 Java 程序总结步骤 安装JDK及配置环境变量 参考&#xff1a;MAC系统安装JDK1.8及环境变量配置 写Java代码 // 文件名&#xff1a;Calculator.java public class Calculator {// 声明本地方法pu…

如何禁止U盘拷贝文件|禁止U盘使用的软件有哪些

禁止U盘拷贝文件的方法有很多&#xff0c;比如使用注册表、组策略编辑器等&#xff0c;但这些方法都适合个人&#xff0c;不适合企业&#xff0c;因为企业需要对下属多台电脑进行远程管控&#xff0c;需要方便、省时、省力的方法。目前来说&#xff0c;最好的方法就是使用第三方…

嵌入式单片机笔试题

DC-DC 和 LDO两者有何区别&#xff1f; DC-DC转换器&#xff08;直流-直流转换器&#xff09;和LDO&#xff08;低压差线性稳压器&#xff09;都是用于电源管理的设备&#xff0c;但它们在原理和特性上有一些显著的区别&#xff1a; 原理&#xff1a; DC-DC转换器通过改变输…

WGCAT工单系统如何配置通知

WGCAT工单系统可以配置邮件通知 只要配置了邮件通知&#xff0c;那么一旦我们账号有新的工单需要处理&#xff0c;就会接受到邮件通知 除了邮件之外&#xff0c;还可以配置其他方式的通知&#xff0c;比如微信钉钉短信等方式&#xff0c;参考如下 https://www.wgstart.com/wgc…

2024年贵州特岗教师招聘报名流程,速速查收哦!

2024年贵州特岗教师招聘报名流程&#xff0c;速速查收哦&#xff01;

利用开源工具创建WEBGIS应用

在本文中&#xff0c;我们将大致说明利用开源工具如何与服务器交互以构建交互式或动态 Web GIS。 WebGIS 应用程序已成为展示地理数据的重要模式。我们现在拥有允许用户交互的机制&#xff0c;以便用户可以选择数据&#xff0c;甚至修改或添加新数据。 什么是WEBGIS? 通过网络…

博客说明 5/12~5/24【个人】

博客说明 5/12~5/24【个人】 前言版权博客说明 5/12~5/24【个人】对比最后 前言 2024-5-24 13:39:23 对我在2024年5月12日到5月24日发布的博客做一下简要的说明 以下内容源自《【个人】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作…

嵌入式单片机启动地址映射关系

一、内核只会从0地址启动 1.0地址第一个字是sp栈指针,第二个字是Reset_Handler入口,参考图1中启动代码中的中断向量表。具体使用流程参考图2(参考自野火) 图1 图2 2.0地址映射以后,软件上使用0地址访问的空间是映射到的器件的空间 3.0地址映射只会影响单个器件上的地址,…

轻量级 K8S 环境 安装minikube

文章目录 操作系统DockerDocker CE 镜像源站使用官方安装脚本自动安装 &#xff08;仅适用于公网环境&#xff09;安装校验Docker代理docker permission denied while trying to connect to the Docker daemon socket minikubekubectl工具minikube dashboard参考资料 操作系统 …

AI大模型探索之路-基础篇5:GLM-4解锁国产大模型的全能智慧与创新应用

目录 前言一、GLM4大模型总体概述二、GLM4和GPT4功能对比三、GLM4和GPT4性能对比1、基础能力&#xff08;英文&#xff09;2、指令跟随能力3、对齐能力4、长文本能力5、多模态-文生图 四、GLM-4 ALL Tools1、文生图2、代码解释器3、网页浏览4、Function Call5、多工具自动调用 …

23种设计模式(持续输出中)

一.设计模式的作用 设计模式是软件从业人员长期总结出来用于解决特定问题的通用性框架&#xff0c;它提高了代码的可维护性、可扩展性、可读性以及复用性。 二.设计模式 1.工厂模式 工厂模式提供了创建对象的接口&#xff0c;而无需制定创建对象的具体类&#xff0c;工厂类…

HarmonyOS之ArkUI布局设计常见细节

这里写目录标题 1. Button设置带有渐变色的背景图片无效1.1 问题分析1.2 成功案例 2. 路由跳转失败2.1 问题分析 1. Button设置带有渐变色的背景图片无效 1.1 问题分析 说明&#xff1a;设置颜色渐变需先设置backgroundColor为透明色。 Button($r(app.string.login), { type…

【机器学习】机器学习与大型预训练模型的前沿探索:跨模态理解与生成的新纪元

&#x1f512;文章目录&#xff1a; &#x1f4a5;1.引言 ☔2.跨模态理解与生成技术概述 &#x1f6b2;3.大型预训练模型在跨模态理解与生成中的应用 &#x1f6f4;4.前沿探索与挑战并存 &#x1f44a;5.未来趋势与展望 &#x1f4a5;1.引言 近年来&#xff0c;机器学习领…

解决Flutter位于悬浮窗口时,应用Logo不更新问题

问题描述 我已经更换了应用Logo&#xff0c;但是发现应用处于悬浮窗口时&#xff0c;logo还是更改之前的&#xff1f;下面的图片只是示意。 解决方案 终端命令 rm -rf ~/Library/Developer/Xcode/DerivedData2.xcode视图内解决 先在顶部找到 Xcode --> Setting --> Lo…