Декодирование base64/UTF-16LE на Си
Моя проблема заключается в попытке декодирования строки с кодировкой utf-16LE которая была зашифрована в base64. Результат такого декодирования всегда первый символ. При этом если попробовать декодировать строку в utf-8/ascii/windows1252, то результат корректный.
Стандартный код из интернета:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
b64_decode_string("SABlAGwAbABvAA==");
return 0;
}
char base64decode_lut[] = {
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 };
void base64decode(char *src, char *dest, int len)
{
int i=0, slen=strlen(src);
for(i=0;i<slen&&i<len;i+=4,src+=4)
{
char c1=base64decode_lut[*src], c2=base64decode_lut[*(src+1)], c3=base64decode_lut[*(src+2)], c4=base64decode_lut[*(src+3)];
*(dest++)=(c1&0x3F)<<0x2|(c2&0x30)>>0x4;
*(dest++)=(c3!=64)?((c2&0xF)<<0x4|(c3&0x3C)>>0x2):'\0';
*(dest++)=(c4!=64)?((c3&0x3)<<0x6|c4&0x3F):'\0';
}
*dest='\0'; // Append terminator
}
int b64_decode_string(char *source)
{
int dest_size;
int res;
char *dest;
dest_size = strlen(source);
dest = (char *)malloc(dest_size);
memset(dest,0,dest_size);
base64decode(source, dest, dest_size);
printf("Decode: %s", dest);
}
Ответы (1 шт):
Автор решения: 0andriy
→ Ссылка
Не знаю, что вы там отлаживали и как проверяли, но код рабочий. Здесь с моими правками, конкретно то, что вам я пытался объяснить ниже:
handle = iconv_open("UTF-8", "UTF-16LE");
if (handle < 0)
perror("Can't open translation");
iconv(handle, &dest, &dest_size, &utf, &utf_size);
iconv_close(handle);
printf("Decode (UTF-8): %s\n", u);
И вот вывод работы программы:
% ./b64
0: 48
1: 0
2: 65
...
Decode: H
Decode (UTF-8): Hello