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.mzph.cn/bicheng/15315.shtml

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

相关文章

数据库DCL语句

数据库DCL语句 介绍&#xff1a; DCL英文全称是Data Control Language(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访 问权限。 管理用户&#xff1a; 查询用户: select * from mysql.user;创建用户: create user 用户名主机名 identified by 密码;修改用…

《计算机网络微课堂》课程概述

​ 课程介绍 本专栏主要是 B 站课程《计算机网络微课堂》的文字版&#xff0c;作者是湖南科技大学的老师。 B 站地址&#xff1a;https://www.bilibili.com/video/BV1c4411d7jb 该课程好评如潮&#xff0c;包含理论课&#xff0c;实验课&#xff0c;考研真题分析课&#xf…

Jenkins在windows上进行安装

今天为了实现jmeter接口测试脚本的持续性集成安装了jenkins&#xff0c;主要记录jenkins的安装和端口的修改。 前提条件&#xff1a;安装了jdk&#xff0c;我本机安装的jdk1.8。 1.下载jenkins安装包 安装jenkins我们需要先下载安装包&#xff0c;可以通过下面的链接进行下载&a…

JavaSE--基础语法(第一期)

Java是一种优秀的程序设计语言&#xff0c;它具有令人赏心悦目的语法和易于理解的语义。不仅如此&#xff0c;Java还是一个有一系列计算机软件和规范形成的技术体系&#xff0c;这个技术体系提供了完整的用于软件开发和 跨平台部署的支持环境&#xff0c;并广泛应用于嵌入式系统…

基于Docker的ElasticSearch、Kibana服务搭建并开启用户鉴权

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;云原生与服务部署专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. 服务搭建 2.1. 部署ElasticSearch 2.2. 部署Kibana 3. …

安全态势管理的六大挑战:态势感知

德迅云安全鉴于如今的安全威胁不断变幻&#xff0c;企业对实施态势管理策略至关重要&#xff0c;可以让安全团队根据需要进行安全策略的动态调整。如果企业在研究构建态势感知管理&#xff0c;需要特别关注以下六个方面的挑战。 如果企业正在使用一个或多个平台&#xff0c;那么…

IS-IS链路状态数据库

原理概述 一个OSPF链路状态数据库是若干条LSA的集合。与此相似&#xff0c;一个IS-IS链路状态数据库是由若干条LSP的集合。与OSPF链路状态数据库不同&#xff0c;IS-IS链路状态数据库有Level-1和Level-2之分。 在IS-IS协议中&#xff0c;每一条LSA都有一条剩余生存时间、一个…

safetensors介绍

1 介绍 safetensors 是 Huggingface 推出的一种可靠、易移植的机器学习模型存储格式&#xff0c;用于安全地存储 Tensor&#xff0c;而且速度很快&#xff08;零拷贝&#xff09;。 safetensors 格式结构&#xff1a; 8 bytes&#xff1a;一个无符号的整数&#xff0c;表示…

Dubbo源码及总结

Springboot整合Dubbo启动解析Bean定义 根据springboot启动原理&#xff0c;会先把启动类下的所有类先进行解析bean定义&#xff0c;所以要先EnableDubbo这个注解&#xff0c;再根据这个注解里面的注解&#xff0c;可以知道import的两个类DubboComponentScanRegistrar和DubboCo…

输入一串字符,输入想要字符串前*的个数n,判断字符串前*的个数是大于n还是小于n,如果大于n则删除多余的*其它保持不变,如果小于n,则字符串也保持不变

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void fun(char* a, int n) {int i 0, j 0, m 0,b0,c0;char* p;p a;//第一步&#xff0c;判断字母前面有多少个*while (p[i] *){j;}printf("字母前*的个数%d\n",j);//求总的字符串长度while (a[m] !…

【全开源】沃德商协会管理系统源码(FastAdmin+ThinkPHP+Uniapp)

一款基于FastAdminThinkPHPUniapp开发的商协会系统&#xff0c;新一代数字化商协会运营管理系统&#xff0c;以“智慧化会员体系、智敏化内容运营、智能化活动构建”三大板块为基点&#xff0c;实施功能全场景覆盖&#xff0c;一站式解决商协会需求壁垒&#xff0c;有效快速建立…

护眼小贴士:学生如何正确使用台灯?

随着电子设备的普及和长时间的用眼&#xff0c;长时间盯着屏幕或学习&#xff0c;眼睛需要不断调节焦距&#xff0c;导致眼睛肌肉疲劳&#xff0c;进而引发视力下降。这种现象在年轻一代甚至青少年中尤为普遍&#xff0c;这种疲劳状态不仅影响眼睛的舒适度&#xff0c;还会导致…

从《红楼梦》的视角看大模型知识库 RAG 服务的 Rerank 调优

背景介绍 在之前的文章 有道 QAnything 源码解读 中介绍了有道 RAG 的一个主要亮点在于对 Rerank 机制的重视。 从目前来看&#xff0c;Rerank 确实逐渐成为 RAG 的一个重要模块&#xff0c;在这篇文章中就希望能讲清楚为什么 RAG 服务需要 Rerank 机制&#xff0c;以及如何选…

Redisson-分布式锁单Redis节点模式

Redisson-分布式锁单Redis节点模式 为什么要用分布式锁&#xff1f; 使用分布式锁的主要目的是为了解决多线程或多进程并发访问共享资源时可能出现的竞争条件和数据一致性问题。举一些实际场㬌&#xff1a; 数据库并发控制&#xff1a;在分布式系统中&#xff0c;多个节点同…

从0开始实现一个博客系统 (SSM 实现)

相关技术 Spring Spring Boot Spring MVC MyBatis Html Css JS 实现功能 用户注册 - 密码加盐加密 (md5 加密)前后端用户信息存储 - 令牌技术用户登录 - (使用 拦截器 做登录校验)博客的增删改查后端数据返回前端, 采用 SpringBoot 做统一功能处理和统一异常处理 数据…

软考-程序员 知识点与部分真题梳理

软考-程序员 知识点与部分真题梳理 参照《程序员教程》第五版划分类别&#xff1b; 持续更新中… 计算机系统基础知识 如何理解和处理浮点数的加减法运算 在计算机科学中&#xff0c;处理浮点数的表示和运算是基础且关键的&#xff0c;尤其是在进行科学计算、图形处理和数据分…

【网络】为什么udp协议报头有长度字段,而tcp没有

引言&#xff1a; 在网络通信中&#xff0c;UDP&#xff08;用户数据报协议&#xff09;和TCP&#xff08;传输控制协议&#xff09;是两种常用的传输层协议。它们在设计和功能上有一些不同之处&#xff0c;其中之一就是报头中的长度字段。本文将深入探讨UDP和TCP协议中长度字…

SpringCloud Alibaba详解:打造高可用的分布式系统

SpringCloud Alibaba是一个基于Spring Cloud的微服务开发框架&#xff0c;它集成了阿里巴巴的一系列中间件和工具&#xff0c;能够快速构建高可用的分布式系统。在本文中&#xff0c;将详细介绍如何使用SpringCloud Alibaba来打造高可用的分布式系统&#xff0c;并通过代码案例…

第十一课,end关键字、简单while循环嵌套、初识for循环

一&#xff0c;end关键字 end关键字用于在print输出的内容后面声明结束的字符&#xff0c;我们之前学过并且十分了解print是默认输出内容之后跟着换行的&#xff0c;如果我们不希望换行而希望使用其它字符来代替换行&#xff0c;就可以用end关键字来实现 特殊的&#xff0c;en…

Redis机制-Redis缓存穿透,击穿,雪崩理解等问题的理解和学习

目录 一 缓存穿透问题 二 缓存击穿问题 三 缓存雪崩问题&#xff1a; 图1 正常的Redis缓存流程 一 缓存穿透问题 我们都知道Redis是一个存储键值对的非关系型数据库&#xff0c;那么当用户进行查询的时候&#xff0c;势必会从前端发起请求&#xff0c;从而数据从Redis缓存…