读书人

怎么将16进制数通过Unicode码转成汉字

发布时间: 2013-09-05 16:02:07 作者: rapoo

如何将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码,就直接可以用
[解决办法]
引用:
Quote: 引用:



按你说的做 可以看到转换后的汉字 ,但是字符类型是wchar_t 格式, 我想转成char或者string类型的 该怎么做?

Linux:iconv
Windows:WideCharToMultiByte

读书人网 >C++

热点推荐