如何将16进制数通过Unicode码转成汉字
如已知 0X11622F66018C,怎么转换成“我是谁”
[解决办法]
0X11622F66018C
如果是数字,int32应该不能表示了吧
如果是字符串 H11622F66018C 可以用下面函数准换
//! Utility function to convert the argument of any type to a string
template<typename T>
std::string toString(const T& arg)
{
std::ostringstream os;
os << arg;
return os.str();
}
// Decode a Hex string.
string decodeHex(const byte* src, long srcSize)
{
// 00000030h: 00 01 02 03 04 05 06 07 08 09 10 10 10 10 10 10 ;
// 00000040h: 10 0D 0A 0B 0C 0D 0E 0F 10 10 10 10 10 10 10 10 ;
// 00000050h: 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 ;
// 00000060h: 10 10 0D 0A 0B 0C 0D 0E 0F 10 10 10 10 10 10 10 ;
// create decoding table
byte invalid = 16;
byte decodeHexTable[256];
for (long i = 0; i < 256; i++) decodeHexTable[i] = invalid;
for (byte i = 0; i < 10; i++) decodeHexTable[static_cast<byte>('0') + i] = i;
for (byte i = 0; i < 6; i++) decodeHexTable[static_cast<byte>('A') + i] = i + 10;
for (byte i = 0; i < 6; i++) decodeHexTable[static_cast<byte>('a') + i] = i + 10;
// calculate dest size
long validSrcSize = 0;
for (long srcPos = 0; srcPos < srcSize; srcPos++) {
if (decodeHexTable[src[srcPos]] != invalid) validSrcSize++;
}
const long destSize = validSrcSize / 2;
// allocate dest buffer
string dest(destSize, '\0');
// decode
for (long srcPos = 0, destPos = 0; destPos < destSize; destPos++) {
byte buffer = 0;
for (int bufferPos = 1; bufferPos >= 0 && srcPos < srcSize; srcPos++) {
byte srcValue = decodeHexTable[src[srcPos]];
if (srcValue == invalid) continue;
buffer
[解决办法]
= srcValue << (bufferPos * 4);
bufferPos--;
}
dest[destPos] = buffer;
}
return dest;
}
[解决办法]
int main()
{
wchar_t msg[4] = {0};
msg[0] = 0x6211;
msg[1] = 0x662f;
msg[2] = 0x8c01;
MessageBoxW(NULL, msg, NULL, 0);
}
unicode每个字其实是一个 unsigned short
只需要把每个16进制USHORT赋值给wchar_t数组的一个元素,连起来就是UNICODE字串。
要注意大小端字节序就行
[解决办法]
#include <iostream>
#include <windows.h>
using namespace std;
// Decode a Hex string.
string decodeHex(const byte* src, long srcSize)
{
// 00000030h: 00 01 02 03 04 05 06 07 08 09 10 10 10 10 10 10 ;
// 00000040h: 10 0D 0A 0B 0C 0D 0E 0F 10 10 10 10 10 10 10 10 ;
// 00000050h: 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 ;
// 00000060h: 10 10 0D 0A 0B 0C 0D 0E 0F 10 10 10 10 10 10 10 ;
// create decoding table
byte invalid = 16;
byte decodeHexTable[256];
for (long i = 0; i < 256; i++) decodeHexTable[i] = invalid;
for (byte i = 0; i < 10; i++) decodeHexTable[static_cast<byte>('0') + i] = i;
for (byte i = 0; i < 6; i++) decodeHexTable[static_cast<byte>('A') + i] = i + 10;
for (byte i = 0; i < 6; i++) decodeHexTable[static_cast<byte>('a') + i] = i + 10;
// calculate dest size
long validSrcSize = 0;
for (long srcPos = 0; srcPos < srcSize; srcPos++) {
if (decodeHexTable[src[srcPos]] != invalid) validSrcSize++;
}
const long destSize = validSrcSize / 2;
// allocate dest buffer
string dest(destSize, '\0');
// decode
for (long srcPos = 0, destPos = 0; destPos < destSize; destPos++) {
byte buffer = 0;
for (int bufferPos = 1; bufferPos >= 0 && srcPos < srcSize; srcPos++) {
byte srcValue = decodeHexTable[src[srcPos]];
if (srcValue == invalid) continue;
buffer
[解决办法]
= srcValue << (bufferPos * 4);
bufferPos--;
}
dest[destPos] = buffer;
}
return dest;
}
int main()
{
const char* cs = "CE D2 CA C7 CB AD"; // 我是谁 GBK码
string hz = decodeHex((byte*)cs, strlen(cs));
cout << hz << endl;
return 0;
}
上面的函数 string 不是款字节,如果用 GBK码,就直接可以用
[解决办法]