Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 计算基本64解码消息的大小_C++_C_Base64 - Fatal编程技术网

C++ 计算基本64解码消息的大小

C++ 计算基本64解码消息的大小,c++,c,base64,C++,C,Base64,我有一个BASE64编码字符串: static const unsigned char base64_test_enc[] = "VGVzdCBzdHJpbmcgZm9yIGEgc3RhY2tvdmVyZmxvdy5jb20gcXVlc3Rpb24="; 它没有CRLF-per-72字符 如何计算解码的消息长度?好吧,base64表示4个字符中的3个字节。。。首先,你只需要除以4,再乘以3 然后,您需要考虑: 如果文本以“==”结尾,则需要减去2个字节(因为最后一组4个字符仅代表1个

我有一个BASE64编码字符串:

static const unsigned char base64_test_enc[] =
    "VGVzdCBzdHJpbmcgZm9yIGEgc3RhY2tvdmVyZmxvdy5jb20gcXVlc3Rpb24=";
它没有CRLF-per-72字符


如何计算解码的消息长度?

好吧,base64表示4个字符中的3个字节。。。首先,你只需要除以4,再乘以3

然后,您需要考虑:

  • 如果文本以
    “==”
    结尾,则需要减去2个字节(因为最后一组4个字符仅代表1个字节)
  • 如果文本以“=”结尾,则需要减去1个字节(因为最后一组4个字符代表2个字节)
  • 如果文本根本不以填充结尾,则不需要减去任何内容(因为最后一组4个字符表示正常情况下的3个字节)

    • Base 64每3字节使用4个字符。如果它使用填充,则始终具有4个字符的倍数

      此外,还有三种填充可能性:

      • 一个编码字节的两个字符和两个填充字符
        ==
      • 三个字符和一个填充字符
        =
        表示两个编码字节
      • 当然没有填充字符,只有3个字节
      因此,您可以简单地将字符数除以4,然后乘以3,最后减去填充字符数


      可能的C代码可能是(如果我对C不是非常生疏,请调整):

      请注意,此代码假定输入是有效的base64



      一个好的观察者会注意到有多余的位,如果使用填充的话,通常在最后的字符中设置为0。

      可能是@CJxD:的重复,尽管这是在相反的方向。而且它有可怕的答案,应该根本没有理由使用双精度、上限等等。当然,不管怎样,这仍然可能是一个骗局。
      size_t encoded_base64_bytes(const char *input)
      {
          size_t len, padlen;
          char *last, *first_pad;
      
          len = strlen(input);
      
          if (len == 0) return 0;
      
          last = input + len - 4;
          first_pad = strchr(last, '=');
          padlen = first_pad == null ? 0 : last - first_pad;
          return (len / 4) * 3 - padlen;
      }