【问题标题】:wchar_t Bit Manipulation On Strings字符串上的 wchar_t 位操作
【发布时间】:2015-12-18 13:35:09
【问题描述】:

尝试编写一个函数来动态编码和解码文本。但是,当我尝试从 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;
}

【问题讨论】:

  • 这会返回什么:sizeof(decode_key);
  • 您能否解释一下究竟发生了什么与您的预期不同? (这与多字节字符串有什么关系?)
  • 另外,选择一种语言,C 或 C++。如果使用 C++ 执行此操作,则只需使用两个算法函数(transformfor_each)。

标签: c++ c string unicode encode


【解决方案1】:
        for (j = 0; j < sizeof(decode_key); j++)

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

Weather Vane 的值得注意的评论: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++)

请注意,编译器可能不会wcslen() 评估移出循环体,因此它将在每次迭代时运行。

【讨论】:

  • @MicroVirus 请详细说明。您当然可能会争辩说静态数组本身就是一种类型,因此适合sizeof(type) 形式,但(sizeof expression) 无论如何都更好地说明了您的意图。
  • 我的意思是我不同意你的观点,(sizeof decodeKey)sizeof(decodeKey) 更正确。否则,很好的答案,尽管您可能还想在您的答案中包含@WeatherVane 的评论以使其“完整”。
  • myMessage[] 将有 两个 终止符(显式和隐式)并且两者都将被wcslen() 忽略。但是在decode_key[] 上使用sizeof 将包含隐式终止符,它不是 解码密钥的一部分。
  • @Anton:无论哪种情况都是sizeof expressionexpression 本身可以包含括号......但在这里它们是完全多余的。 ; j &lt; sizeof decode_key ; 完全没问题,这里根本不需要括号。
  • @BenVoigt 尽管sizeof(expr)(sizeof (expr)) 相同,仅等于(sizeof expr),但我发现使用看起来不正确的表单而不是正确的表单会产生误导,即使它可以编译正好。相反,您不能使用(sizeof type) 代替sizeof(type),因为它根本无法编译。当尝试将 (sizeof expr) 与不了解 C++11 改进的编译器一起使用时,它们的区别更加明显,因为这不适用于非静态成员字段。因此,最好记住区别并在代码中明确说明您的意图。
猜你喜欢
  • 2020-06-08
  • 2021-11-21
  • 2021-09-26
  • 2013-01-25
  • 2020-09-27
  • 2019-03-25
  • 1970-01-01
  • 2013-05-29
  • 2017-09-16
相关资源
最近更新 更多