首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-09-05 
如何将16进制数通过Unicode码转成汉字如已知 0X11622F66018C,怎么转换成“我是谁”[解决办法]0X11622F66018C

如何将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

热点排行