【发布时间】:2023-03-07 19:55:01
【问题描述】:
我正在尝试在 C 中将一些数据从十六进制转换为 base64,我在网上找到了一个算法,但我真的很想知道它是如何工作的,而不是仅仅实现它并启动它。如果有人可以解释以下是如何工作的,我将不胜感激。我一直在阅读有关班次操作员的信息,但我似乎并没有像我想象的那样理解它们……对我来说并不是很清楚。
for (x = 0; x < dataLength; x += 3)
{
/* these three 8-bit (ASCII) characters become one 24-bit number */
n = data[x] << 16;
if((x+1) < dataLength)
n += data[x+1] << 8;
if((x+2) < dataLength)
n += data[x+2];
/* this 24-bit number gets separated into four 6-bit numbers */
n0 = (uint8_t)(n >> 18) & 63;
n1 = (uint8_t)(n >> 12) & 63;
n2 = (uint8_t)(n >> 6) & 63;
n3 = (uint8_t)n & 63;
此代码取自 Wikibooks,不是我的,我只是想了解位移以及它是如何让我转换数据的。
感谢您的帮助,我真的很感激。
来源:Base64
【问题讨论】:
-
如果你理解了位运算符的作用,那么你在代码中没有理解什么?
-
您可以将您对
>>、<<和&的理解添加到问题中——然后看看您是否还有问题。 -
好的,我会以我有限的理解编辑它。再次感谢您的帮助。
-
63 = 0b00111111,加上一些了解@Arkadiy 所说的你应该自己尝试一下。(0b00111111 这是它在 RAM 中的一个字节内存中的样子,0b 表示数字是二进制的,00111111 是二进制数)
-
位移正如其名称所暗示的那样。
n >> 1表示 n 的最低二进制位被丢弃,次高位变为最低位,依此类推。例如,00011001 >> 1会产生00001100。有符号整数类型还有更多内容(传播符号位),但本质是移位。移位和位掩码(&运算符)的组合允许您从单词中间取出一堆位并将它们视为单独的数字。
标签: c bit-manipulation shift