wchar_t对字符串的位操作

时间:2015-09-21 18:30:22

标签: c++ c string unicode encode

尝试编写一个动态编码和解码文本的函数。但是,当我尝试从Multibyte转换为Widechar时,我遇到了一些问题。谁知道我做错了什么?

BOOL decode_comp     = TRUE;
wchar_t decode_key[] = L"abc123";
wchar_t myMessage[]  = L"\x18\x35\x3C\x3C\x3F\x70\x07\x3F\x22\x3C\x34\x71\x00"; // Hello World

wchar_t *Decode(wchar_t *s)
{
    unsigned int i, j;
    wchar_t *string;

    string = (wchar_t *)malloc((wcslen(s) + 1) * sizeof(wchar_t));

    wcscpy(string, s);

    for (i = 0; i < wcslen(string); i++)
    {
        for (j = 0; j < sizeof(decode_key); j++)
            string[i] ^= decode_key[j];

        if (decode_comp)
            string[i] = ~string[i];
    }

    return string;
}

1 个答案:

答案 0 :(得分:2)

        for (j = 0; j < sizeof(decode_key); j++)

这是错误:sizeof()总是以字节为单位返回大小(char s的数量),这是decode_key中字符数的两倍,只要{{1}大小为2个字节。顺便说一句,这种情况的更正确的语法是wchar_t

Weather Vane值得注意的评论: (sizeof decodekey)还包括您通常不想计算的终结符。

sizeof(decode_key)

在字符串文字的末尾不需要wchar_t myMessage[] = L"\x18\x35\x3C\x3C\x3F\x70\x07\x3F\x22\x3C\x34\x71\x00";

'\x00'

请注意,编译器可能for (i = 0; i < wcslen(string); i++) 评估移出循环体,因此它将在每次迭代时运行。