C - 使用位移运算符进行基本转换

 dancejust25679 发布于 2023-02-07 08:28

我正在尝试将一些数据从十六进制转换为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

1 个回答
  • 首先,输入数据不是十六进制,如你所说.它只是存储为字节的数据.该代码将会给你它的Base64表示(虽然你发布的代码没有将其映射的一部分n0,n1,n2,n3可打印的ASCII字符).

    假设输入的前三个字节是(以二进制表示,每个字母代表0或1):

    abcdefgh, ijklmnop, qrstuvwx
    

    代码的第一部分将它们组合成一个24位数字.这是通过将第一个16位向左移位而第二个向左移动8位并添加:

      abcdefgh0000000000000000      (abcdefgh << 16)
    + 00000000ijklmnop00000000      (ijklmnop << 8)
      0000000000000000qrstuvwx
      ------------------------
      abcdefghijklmnopqrstuvwx
    

    然后通过移位和移动将它分成四个6位数.例如,第二个数字是通过向右移动12位并且用111111进行计算来计算的

    n     =   abcdefghijklmnopqrstuvwx
    
    n>>12 =   000000000000abcdefghijkl
    63    =   000000000000000000111111
    
    And'ing gives:
              000000000000000000ghijkl
    

    2023-02-07 08:34 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有