如何解决使用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]);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。