簡體   English   中英

Base64 解碼 - 位移導致 C 中字符數組意外結束

[英]Base64 decoding - bit shift results in unexpected end of char array in C

我已經使用了很多不同的函數來解碼 C 中的 Base64 編碼字符數組。現在,我正在使用這個函數來解碼 Base64 字符數組。

    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()不是標准庫函數。

因此,對於后代,您的代碼的原始來源在這里,在文件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()函數的程序的代碼示例。

工作在線演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM