專案使用 Unicode 字元集,需將如漢字「沖」轉為十六進位字串 "51B2" (UTF-16LE 編碼值)。
wchar_t 高低位元組:wchar_t 16 位元,高位在前 (大端序),需存為 char[2] 低位在前 (小端序) 以便後續逐位元組處理。"0123456789ABCDEF",高 4 位 + 低 4 位。// W2C: 將 wchar_t 拆為小端序 char[2]
void W2C(wchar_t w_cn, char c_cn[2]) {
c_cn[0] = static_cast(w_cn >> 8); // 高位元組
c_cn[1] = static_cast(w_cn & 0xFF); // 低位元組
}
// 主轉換函式
CString ConvertWCHARToHex(const CString& Data, long nDataLength) {
CString sResult;
static const char* hex = "0123456789ABCDEF";
for (long i = 0; i < nDataLength; ++i) {
wchar_t ch = Data.GetAt(i);
char bytes[2];
W2C(ch, bytes);
for (int b = 0; b < 2; ++b) {
unsigned char byte = static_cast(bytes[b]);
sResult += hex[byte >> 4];
sResult += hex[byte & 0x0F];
}
}
return sResult;
}
unsigned char 強制轉換避免負值擴展導致索引越界。WideCharToMultiByte(CP_UTF8, ...) 後再逐位元組轉十六進位。CString 在 Unicode 建置下即 CStringW,GetAt 回傳 wchar_t。CString src = L"沖"; // U+6C96
CString hex = ConvertWCHARToHex(src, src.GetLength());
// hex == "966C" (小端序) 或 "6C96" (大端序) 視 W2C 實作而定
// 本文實作為小端序輸出:低位元組在前 → "966C"
注意:Unicode 碼位 U+6C96 = 0x6C96,小端序位元組序為 96 6C,故輸出 "966C"。若需大端序輸出,調整 W2C 順序即可。