【问题标题】:Base64 implementation with bit shifting带位移位的 Base64 实现
【发布时间】:2020-08-11 16:45:29
【问题描述】:

我尝试实现 base64 编码器。我有这个算法:

while (len--)
{
    char_array_3[i++] = *(data++);

    if (i == 3)
    {
        char_array_4[0] = (char_array_3[0] & 252) >> 2; //This line.
        char_array_4[1] = ((char_array_3[0] & 3) << 4) + ((char_array_3[1] & 240) >> 4);
        char_array_4[2] = ((char_array_3[1] & 15) << 2) + ((char_array_3[2] & 192) >> 6);
        char_array_4[3] = char_array_3[2] & 63;

        for (i = 0; i < 4; i++) {
            ret += base64_chars[char_array_4[i]];
        }
        i = 0;
    }
}

为什么我应该做char_array_3[0] &amp; 252?我只能使用&gt;&gt; 2。由于...

例如,如果我把这个字符H:

H -&gt; 01001000

我可以做位移: 01001000 &gt;&gt; 2 = 000100100

或者使用and (&amp;)...

252 -&gt; 11111100

01001000 &amp; 11111100 = 01001000我会有同样的数字...

然后需要这样做: 01001000 &gt;&gt; 2 = 000100100

我可以删除号码2523240 等吗?

【问题讨论】:

  • “和其他”是什么意思?还有什么?
  • 我会先尝试让这段代码可读。例如用十六进制替换十进制常量。
  • @David Schwartz,我的意思是 25232401519263
  • @lostsky25 如果您认为可以删除((char_array_3[0]&amp;3)&lt;&lt;4) 中的3,那么您就是不了解代码。
  • @Slava,在第一个实现中,我有十六进制文字。我刚改成十进制文字。

标签: c++ base64 implementation


【解决方案1】:

我可以删除数字 252、3、240 等吗?

不,不是全部。在右移和二进制掩码 252、240 和 192 的情况下,它们是多余的,您可以删除它们。但是 3 15 和 63 并不是多余的,因为您会传播不应该传播的位。

【讨论】:

  • 将冗余常量留在那里可能会使代码更易于理解。一个好的优化器会认识到它们是多余的,并从编译的代码中删除它们。
  • @MarkRansom 我同意,但 OP 的问题是他是否可以删除它们,而不是为什么它们首先存在。
  • 是的,我删除了多余的数字。我得到了相同的字符串...我会将十进制常量更改为十六进制。
  • “我为什么要”也是问题的一部分。意识到我没有抱怨,只是提出了不同的观点。
  • @MarkRansom ""我为什么要"也是问题的一部分。"。是的,错过了,好点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多