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.pswp.cn/bicheng/15315.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15315.shtml
英文地址,請注明出處:http://en.pswp.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 密碼;修改用…

Go語言垃圾回收機制原理

1. 概述 垃圾回收是一種自動內存管理技術&#xff1a;通過檢測程序中不再使用的內存&#xff0c;并釋放這些內存供其他對象使用。 應用程序中會使用到兩種內存&#xff0c;分別為堆(Heap)和棧(Stack)。GC不負責回收棧內存&#xff0c;只負責回收堆內存。 函數執行完后&#xff…

《計算機網絡微課堂》課程概述

? 課程介紹 本專欄主要是 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…

10分鐘用QEMU搭建嵌入式開發環境學習Linux

安裝依賴軟件 作者的使用的是ubuntu22.04版本。 sudo apt-get install git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev ninja-build sudo apt-get install git-email sudo apt-get install libaio-dev libbluetooth-dev libcapstone-dev libbrlapi-dev libbz2-d…

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;那么…

java為什么main方法是主程序入口?已回答

答&#xff1a; 其實是C語言程序員規定的main&#xff0c;java程序才能通過main來進入程序&#xff0c;java程序是通過jvm虛擬機來運行的&#xff0c;其實main方法是可以修改的&#xff0c;C程序員來規定是main方法來進入主程序&#xff0c;還是其他方法進入主程序&#xff0c;…

IS-IS鏈路狀態數據庫

原理概述 一個OSPF鏈路狀態數據庫是若干條LSA的集合。與此相似&#xff0c;一個IS-IS鏈路狀態數據庫是由若干條LSP的集合。與OSPF鏈路狀態數據庫不同&#xff0c;IS-IS鏈路狀態數據庫有Level-1和Level-2之分。 在IS-IS協議中&#xff0c;每一條LSA都有一條剩余生存時間、一個…

[力扣題解] 417. 太平洋大西洋水流問題

題目&#xff1a;417. 太平洋大西洋水流問題 思路 代碼 (1) MyMothed // 符合條件的點 : 既可以到達左或上邊界&#xff0c;也可以到達右或下邊界&#xff1b; class Solution { private:int dir[4][2] {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};vector<vector<int>&g…

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;還會導致…

linux配置防火墻端口

配置防火墻&#xff0c;添加或刪除端口&#xff0c;需要有root權限。 防火墻常用命令如下&#xff1a; 1.查看防火墻狀態&#xff1a; systemctl status firewalld active(running)&#xff1a;開啟狀態&#xff0c;正在運行中 inactive(dead)&#xff1a;關閉狀態&#xff…

十、OpenAI之視覺

視覺 學習怎樣使用視覺能力理解圖片 1. 介紹 GPT-4o和GPT-4 Turbo兩個模型都擁有視覺能力&#xff0c;這意味著模型可以接收圖片并回答關于圖片的問題。從歷史上看&#xff0c;語言模型系統被限制采用單一的文本輸入方式。 2. 快速開始 模型使用圖片主要有2種方式&#xff…

qml下拉條實現

qml下拉條實現 代碼結構 代碼結構 Rectangle里面嵌套一個Flickable&#xff0c;然后下面是一個Rectangle&#xff0c;作為滑動的區域&#xff0c;給最外層的Rectangle的y加一個屬性動畫。滑動區域寫好onPressed和Onrelease即可。 import QtQuick 2.15 import QtQuick.Control…

從《紅樓夢》的視角看大模型知識庫 RAG 服務的 Rerank 調優

背景介紹 在之前的文章 有道 QAnything 源碼解讀 中介紹了有道 RAG 的一個主要亮點在于對 Rerank 機制的重視。 從目前來看&#xff0c;Rerank 確實逐漸成為 RAG 的一個重要模塊&#xff0c;在這篇文章中就希望能講清楚為什么 RAG 服務需要 Rerank 機制&#xff0c;以及如何選…