Декодирование двоичной строки в кодировке base64 на C - PullRequest
1 голос
/ 16 июля 2011

Я пытаюсь заставить мой код декодера работать. Я использую пример 64-битной кодированной строки из wikipedia , пытаясь воспроизвести текст, который они закодировали.

#include <stdio.h>

//Convert raw binary character to the cb64 index
unsigned char get_cb64(unsigned char c){
if(c>='A' && c<='Z'){return c-'A';}
if(c>='a' && c<='z'){return c-'G';}
if(c>='0' && c<='9'){return c+4;}
if(c=='+'){return '>';}
if(c=='/'){return '?';}
else{return 0;}
}

void main(int argc, char** argv)
{
unsigned char* str = "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=";

//convert each binary character to its cb64 index
int size = 360;
int num_bytes = 8;
unsigned char str_cb64[size + 1];
int cb64_idx;
int i;
for(i=0; i < size; i++){
    str_cb64[i]=get_cb64(str[i]);
}
str_cb64[size] = 0;

//convert blocks of 4 6 bit chars to 3 8 bit chars 
int end_size = size*6/8;
unsigned char ascii_out[end_size];
int out_idx = 0;
int in_idx = 0;
while(in_idx < end_size/4){
  ascii_out[out_idx]   = str_cb64[in_idx+0] << 2 | str_cb64[in_idx+1] >> 4;
  ascii_out[out_idx+1] = str_cb64[in_idx+1] << 4 | str_cb64[in_idx+2] >> 2;
  ascii_out[out_idx+2] = str_cb64[in_idx+2] << 6 | str_cb64[in_idx+3];
    out_idx += 3;
    in_idx += 4;
}   

for(i=0; i < end_size; i++){printf("%d\n",ascii_out[i]);}

}

Для проверки код здесь печатает значение ascii каждого декодированного символа, которое ДОЛЖНО быть между 48 и 122, но есть значения из (0, 255). Я проверил преобразование из исходного двоичного файла в индекс cb64, и это, кажется, работает нормально. Проблема в моем переходящем коде. Есть идеи, почему это не работает? Я дважды проверил смены, и они выглядят так, как будто они закодированы правильно.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 16 июля 2011

Статья в Википедии, на которую вы ссылаетесь, предназначена для кодирования Base64 .Предполагая, что это то, что вы пытаетесь сделать, вы можете найти ответ в этом посте:

Как мне base64 кодировать (декодировать) в C?

0 голосов
/ 16 июля 2011

Ваш цикл должен быть либо while(in_idx < size), либо while(out_idx < end_size). Прямо сейчас вы сравниваете входное значение с выходным значением, а также делите выходное значение, даже если вы добавляете по одному для каждого байта вместо каждой итерации. Это приведет к тому, что ваш цикл завершится задолго до того, как все данные будут обработаны. Поскольку ascii_out не был инициализирован, это может быть единственной проблемой, если начало вывода верно, поскольку конец будет содержать случайные данные, которые оказались в этом пространстве.

...