使用C解码base64 / UTF-16LE

问题描述

我的问题是尝试解码base64 / UTF-16LE字符串。解码的结果始终是第一个字符。如果将字符串解码为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,62,63,52,53,54,55,56,57,58,59,60,61,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,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
};
 

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,dest_size);
    base64decode(source,dest,dest_size);
    printf("Decode: %s",dest);
}

解决方法

仅第一个字符被解码的原因是因为第二个字符以0x00字节开头,所以对strlen()(仅用于ascii字符串)的调用返回的数字很小(如1或2)。而不是字符串的实际长度。

建议您熟悉wchar_t类型和处理宽字符的函数,例如:wprintf()和字符串的'wide'修饰符:-L和头文件:{{ 1}}

how to handle wide character strings

,

您在这里不使用C字符串,因此不要使用strlen();

这样的字符串函数

并考虑使用unsigned char作为数组的类型

unsigned char base64decode{} = {...

在这种情况下,数组元素的数量可以由以下语句确定:

size_t len = sizeof(base64decode_lut)/sizeof(base64decode_lut[0]);

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...