1. 程式人生 > >在C++中檢測和轉換位元組序(ENDIAN)

在C++中檢測和轉換位元組序(ENDIAN)

轉自:http://www.cppblog.com/johndragon/archive/2007/04/18/22201.html

在做跨平臺的網路資料傳輸和檔案資料轉換和移植的時候,經常會碰到CPU位元組序不同導致的各種各樣的問題.
於是,在編寫平臺無關,字元編碼無關的要求之外,又有一個新的對跨平臺編碼的要求,那就是位元組序無關.
其實要實現這個也不難, 只要能夠檢測和轉換位元組序, 就完全可以實現.
下面提供各一種方法來解決這兩個問題. 

//   檢測平臺的Endian
typedef union uEndianTest{
 struct
 {
  bool flittle_endian;
  bool fill[3];
 };
 long value;
}EndianTest;
static const EndianTest __Endian_Test__ = { (long)1 };
const bool platform_little_endian = __Endian_Test__.flittle_endian;

這樣使用這個 platform_little_endian 就可以檢測到當前平臺是否是little_endian

//   Endian 轉換(64位, 32位和16位的位元組序轉換)
//   中間使用了異或交換的演算法
//   使用方法舉例:
//   long lValue = 0xff000000;
//   ConvertEndian32( &lValue );
//   
inline void ConvertEndian64( LPVOID lpMem )
{
 BYTE * p = (BYTE*)lpMem;
 p[0] = p[0] ^ p[7];
 p[7] = p[0] ^ p[7];
 p[0] = p[0] ^ p[7];

 p[1] = p[1] ^ p[6];
 p[6] = p[1] ^ p[6];
 p[1] = p[1] ^ p[6];

 p[2] = p[2] ^ p[5];
 p[5] = p[2] ^ p[5];
 p[2] = p[2] ^ p[5];

 p[3] = p[3] ^ p[4];
 p[4] = p[3] ^ p[4];
 p[3] = p[3] ^ p[4];
}

inline void ConvertEndian32( LPVOID lpMem )
{
 BYTE * p = (BYTE*)lpMem;
 p[0] = p[0] ^ p[3];
 p[3] = p[0] ^ p[3];
 p[0] = p[0] ^ p[3];
 p[1] = p[1] ^ p[2];
 p[2] = p[1] ^ p[2];
 p[1] = p[1] ^ p[2];
}

inline void ConvertEndian16( LPVOID lpMem )
{
 BYTE * p = (BYTE*)lpMem;
 p[0] = p[0] ^ p[1];
 p[1] = p[0] ^ p[1];
 p[0] = p[0] ^ p[1];
}

相關推薦

C++檢測轉換位元組(ENDIAN)

轉自:http://www.cppblog.com/johndragon/archive/2007/04/18/22201.html 在做跨平臺的網路資料傳輸和檔案資料轉換和移植的時候,經常會碰到CPU位元組序不同導致的各種各樣的問題. 於是,在編寫平臺無關,字元編碼無

C++數字字符串的轉換

oat 不能 ring1 相關 輸出 displays tof spl 進制轉換 1、字符串數字之間的轉換(1)string --> char * string str("OK"); char * p = str.c_str();(2)char * -->

C++static_castdynamic_cast強制類型轉換

tro 父類 虛函數表 找到 virt 內部 pub 判斷 () 在C++標準中,提供了關於類型層次轉換中的兩個關鍵字static_cast和dynamic_cast。 一、static_cast關鍵字(編譯時類型檢查) 用法:static_cast < type-i

c# xmljson 互相轉換

XML serialize AD -- ldo data nod load str --xml轉json XmlDocument doc = new XmlDocument(); doc.LoadXml(result); st

C#結構體與位元組流互相轉換

C++的訊息結構體如下 struct cs_message{ u32_t cmd_type; char username[16]; u32_t dstID; u32_t

C# BitmapHalconHObject資料型別的相互轉換

              C# 中Bitmap和Halcon中HObject資料型別的相互轉換         public void Bitmap2HObjectBpp24(Bitm

C++static_castdynamic_cast強制型別轉換

轉載地址:http://blog.csdn.net/qq_26849233/article/details/62218385 一、static_cast關鍵字(編譯時型別檢查) 用法:static_cast < type-id > (expression

c# intString互相轉換

1,int轉成string用toString 或者Convert.toString()如下 例如:int varInt = 1; string varString = Convert.ToString(varInt); string varString2 = varInt.

C++stringint相互轉換

string轉int: 標頭檔案: #include <cstdlib> string a; int b; a = "314"; b = atoi(a.c_str()); int轉str

C#的流、位元組、字元字串

首先要明白它們本身是由什麼組成的: 流:二進位制 位元組:無符號整數 字元:Unicode編碼字元 字串:多個Unicode編碼字元 那麼在.net下它們之間如何轉化呢? 一般是遵守以下規則: 流->位元組陣列->字元陣列->字串 下

判斷小端位元組大端位元組C程式

編寫一個C程式,實現32位CPU中儲存方式小端位元組序和大端位元組序的判別。 ONE: #include<stdio.h> #define LBS 0 #define MBS 1 { int main(int) { int a=0x12345678; c

C# As 強制轉換的總結

1.1.1 摘要C#是一門強型別語言,一般情況下,我們最好避免將一個型別強制轉換為其他型別,但有些時候難免要進行型別轉換。先想想究竟哪些操作可以進行型別轉換(先不考慮.NET提供的Parse),一般我們都有以下選擇: 使用as操作符轉換,使用傳統C風格的強制轉型使用is來做一個轉換測試,然後再使用as操作符或

C#&&&,|||區別

.com blank img cnblogs png ref bsp 筆記 區別 當兩者都為邏輯運算符時。 其實沒什麽差別。 &&和||當已經確定結果時,不會對第二個操作數求值。也不知道什麽情況會用到這個差別。做個筆記好了。 http://blog.cs

C++typenameclass的區別

type .get true 能夠 class .... ray pla 依賴 在c++Template中很多地方都用到了typename與class這兩個關鍵字,而且好像可以替換,是不是這兩個關鍵字完全一樣呢? 相信學習C++的人對class這個關鍵字都非常明白,clas

C++的###運算符

合並操作 col 否則 未定義 info merge eight 標識符 轉換 #和##運算符 #:構串操作符 構串操作符#只能修飾帶參數的宏的形參,它將實參的字符序列(而不是實參代表的值)轉換成字符串常量 #define STRING(x) #x#x#x #defin

c#ClassStruct使用與性能的區別

回收 數據結構 com 垃圾回收 父類 改變 med .cn 指針 在Unity中很多已經定義為結構體的數據結構 Vector2, Vector3 和 Vector4 Rect Color和Color32 Bounds Touch 1.Class為引用類型,Str

C#MonitorLock以及區別

能夠 program tor 試圖 tro 指定 object span () 原文地址:http://www.cnblogs.com/chengxingliang/p/3150731.html   Monitor對象   1.Monitor.Enter(object)方法

C#Convertparse的區別

處理 捕獲 用戶 整數 request 存在 query 轉換 中間 Convert.ToInt32()與int.Parse()的區別(1)這兩個方法的最大不同是它們對null值的處理方法: Convert.ToInt32(null)會返回0而不會產生任何異常,但int.P

C#&&&的區別

poi log sha 與操作 位運算 orm 第一個 pre 繼續 SiKi老師讓我們自行查一下&和&&的區別,So... 1)&和&&都可以用作邏輯與的運算符,表示邏輯與(and),當運算符兩邊的表達式的結果都為tru

C/C++nearfar的區別

語言 補充 detail net 計算機體系結構 偏移 單元 體系結構 all C/C++中near和far的區別 關鍵字near和far受目標計算機體系結構的影響。目前編程中使用不多。 near關鍵字創建一個指向可尋址內存低端部分的目標指針。這些