Base64解码-位移导致C中的char数组意外结束

问题描述

我已经使用了许多不同的函数来解码C语言中的Base64编码的char数组。现在,我正在使用此函数来解码Base64的char数组。

    unsigned int b64_decode(const unsigned char* in,unsigned int in_len,unsigned char* out) {

    unsigned int i=0,j=0,k=0,s[4];

    for (i=0;i<in_len;i++) {
        s[j++]=b64_int(*(in+i));
        if (j==4) {
            out[k+0] = ((s[0]&255)<<2)+((s[1]&0x30)>>4);
            if (s[2]!=64) {
                out[k+1] = ((s[1]&0x0F)<<4)+((s[2]&0x3C)>>2);
                if ((s[3]!=64)) {
                    out[k+2] = ((s[2]&0x03)<<6)+(s[3]); k+=3;
                } else {
                    k+=2;
                }
            } else {
                k+=1;
            }
            j=0;
        }
    }

    return k;
}

问题是,对于这样的 QKSRjAEAAAAB3bW3rVpoJOA8bsb3eEuEEDiq 这样的Base64字符串,我得到的字符串只有五个字符,甚至解码后的文本也应该更长。我尝试调试代码,这是因为第六个字符的移位结果为0,这意外地结束了字符串。在线Base64解码器可以毫无问题地解码上述字符串。

然后我想将解码后的字符串转换为十六进制。我这样做是这样的:

for (int i = 0,j = 0; i < size; ++i,j += 2) {
                sprintf(data_hex + j,"%02x",decoded_data[i] & 0xff);
            }

预期输入示例: QKSRjAEAAAAB3bW3rVpoJOA8bsb3eEuEEDiq

预期输出示例: 40a4918c0100000001ddb5b7ad5a6824e03c6ec6f7784b841038aa

感谢您的回复

解决方法

好吧,花了一段时间才弄清楚您从何处获得此代码。关键是意识到b64_int()不是标准库函数。

因此,为了后代,您的代码的原始来源为here,位于文件base64.hbase64.cc中。

这是有效的程序:

#include <stdio.h>
#include <string.h>
#include "base64.h"

int main(void) {

  unsigned char in[] = "QKSRjAEAAAAB3bW3rVpoJOA8bsb3eEuEEDiq\0";
  int inLength = strlen((char*)in);

  unsigned char out[1000]; 
  unsigned int outLength = b64_decode(in,inLength,out);
  
  // Prints the result in Hexadecimal format.
  for (int i = 0; i < outLength; i++)
    printf("%x",out[i]);

  printf("\n");
  return 0;
}

关键在于捕获b64_decode()的返回值,该值告诉您期望结果中有多少字节。尚不清楚是否执行此操作,因为没有提供调用b64_decode()函数的程序的代码示例。

Working online demo