在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_cast和dynamic_cast強制類型轉換
tro 父類 虛函數表 找到 virt 內部 pub 判斷 () 在C++標準中,提供了關於類型層次轉換中的兩個關鍵字static_cast和dynamic_cast。 一、static_cast關鍵字(編譯時類型檢查) 用法:static_cast < type-i
c#中 xml和json 互相轉換
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# 中Bitmap和Halcon中HObject資料型別的相互轉換
C# 中Bitmap和Halcon中HObject資料型別的相互轉換 public void Bitmap2HObjectBpp24(Bitm
C++中static_cast和dynamic_cast強制型別轉換
轉載地址:http://blog.csdn.net/qq_26849233/article/details/62218385 一、static_cast關鍵字(編譯時型別檢查) 用法:static_cast < type-id > (expression
c#中 int和String互相轉換
1,int轉成string用toString 或者Convert.toString()如下 例如:int varInt = 1; string varString = Convert.ToString(varInt); string varString2 = varInt.
C++中string和int相互轉換
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++中typename和class的區別
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#中Class和Struct使用與性能的區別
回收 數據結構 com 垃圾回收 父類 改變 med .cn 指針 在Unity中很多已經定義為結構體的數據結構 Vector2, Vector3 和 Vector4 Rect Color和Color32 Bounds Touch 1.Class為引用類型,Str
C#中Monitor和Lock以及區別
能夠 program tor 試圖 tro 指定 object span () 原文地址:http://www.cnblogs.com/chengxingliang/p/3150731.html Monitor對象 1.Monitor.Enter(object)方法
C#中Convert和parse的區別
處理 捕獲 用戶 整數 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++中near和far的區別
語言 補充 detail net 計算機體系結構 偏移 單元 體系結構 all C/C++中near和far的區別 關鍵字near和far受目標計算機體系結構的影響。目前編程中使用不多。 near關鍵字創建一個指向可尋址內存低端部分的目標指針。這些