[英]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.h和base64.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.