C语言中的Base64到Base10解码

C语言中的Base64到Base10解码,c,base64,base,C,Base64,Base,我是编程新手,正在尝试将十进制数转换为base64,然后再转换回来。我的代码的编码部分可以工作,但我就是不能让解码部分工作。外面有人能帮忙吗 /* ============================================================================ Name : base64.c Author : Peter Doyle Version : Copyright : Your copyright no

我是编程新手,正在尝试将十进制数转换为base64,然后再转换回来。我的代码的编码部分可以工作,但我就是不能让解码部分工作。外面有人能帮忙吗

/*
 ============================================================================
 Name        : base64.c
 Author      : Peter Doyle
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>

static char *base64enc(long unsigned int value)
{
    char base64[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    /* log(2**64) / log(64) = 12.38 => max 13 char + '\0' */
    char buffer[12];
    unsigned int offset = sizeof(buffer);

    buffer[--offset] = '\0';
    do {
        buffer[--offset] = base36[value % 64];
    } while (value /= 64);

    return strdup(&buffer[offset]);
}


int base2base(unsigned char in[], int basein, int baseout)
{
    int J;
    int K;
    int DecimalValue;

    int InputNumberLength;

    //unsigned char OutputValue[];

    unsigned char NumericBaseData[]={"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"};

    //convert input number to base 10.
    InputNumberLength = sizeof(in);
    DecimalValue = 0;
    for (J = 0; J < InputNumberLength; J++){
        for (K = 0; K < basein; K++){
            char sub1;
            char sub2;
            char inJ = (in+J);
            char NumericBaseDataK = (NumericBaseData+K);
            strncpy(sub1, inJ, 1);
            strncpy(sub2, NumericBaseDataK, 1);
                if (sub1 == sub2){
                    int Calc = ((K-1)*(pow(basein,(InputNumberLength-J)))+.5);
                    DecimalValue = DecimalValue+Calc;
                }
        }
    }
    return DecimalValue;
}

int main(void) {
    long unsigned int test = 6000;
    char *encoded = base36enc(test);
    puts(encoded);
    base2base(encoded, 64, 10);
    printf("%d\n", DecimalValue);
    return EXIT_SUCCESS;
/*
============================================================================
名称:base64.c
作者:彼得·道尔
版本:
版权:您的版权声明
描述:C语言的Hello World,Ansi风格
============================================================================
*/
#包括
#包括
静态字符*base64enc(长无符号整数值)
{
char base64[64]=“abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzo123456789+/”;
/*log(2**64)/log(64)=12.38=>最大13个字符+'\0'*/
字符缓冲区[12];
无符号整数偏移量=sizeof(缓冲区);
缓冲区[--offset]='\0';
做{
缓冲区[--offset]=base36[值%64];
}而(值/=64);
返回strdup(&buffer[offset]);
}
int base2base([]中的无符号字符,int basein,int baseout)
{
int J;
int K;
整数小数;
int InputNumberLength;
//无符号字符输出值[];
无符号字符NumericBaseData[]={“abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz012456789+/”;
//将输入数字转换为基数10。
InputNumberLength=sizeof(英寸);
小数=0;
对于(J=0;J
如果str是以64为基数的字符串,只需执行以下操作即可将其转换为以10为基数:

int function(static char *str)
{
int i = 0;
int decimal = 0;
int mult = 1;
while (str[i])
   i++;
i--;
while (i >= 0)
   {
       decimal += mult * get_index(str[i]);
       i--;
       mult = mult * 64;
   }
return decimal;
}
其中get_index获取NumericBaseData中char str[i]的索引 Tbh我没有测试它,但应该可以工作

编辑: get_索引将是这样的smth

int get_index(char c)
{
    char base64[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    int i = 0;
    while (c != base64[i])
         i++;
    return i;

}

如果你使用大数字,也许会把类型改成长的,因为SMTH在64的基础上可以得到很大的快速。

< P>我发现有用的答案是“dieBaCon”从旧项目中解码数据库。所以我修改了这个解决方案,利用C++ +STD= C++ 17。B64代码化是很好的,把数字压缩成文件。,如长度、索引等

static const std::string base64_chars = 
             "ABCDEFGHIJKLMNOPQRSTUVWXYZ" // 26
             "abcdefghijklmnopqrstuvwxyz" // 26
             "0123456789+/"; // 12

int base64_decode_number(const std::string& input) {
    // Decode a positive number. Return 0 When the input contains a not valid character or overflow will ocurr;

    const int N64 = 64;
    const int overflow_LIMIT = 5; // Prevent N64*N64*N64... > std::numeric_limits<int>::max();

    if ( input.empty() || input.size() > overflow_LIMIT ) return  0;
    int pos_val = 1; // positional value
    int result = 0;
    for( auto itpos = input.rbegin(); itpos < input.rend(); itpos++){

        if ( size_t digit_b10 = base64_chars.find(*itpos); 
                    digit_b10 == base64_chars.npos ) return 0;
        else {
            result += pos_val*static_cast<int>(digit_b10);
            pos_val *= N64;
        }
    }
    return result;
}
static const std::string base64\u chars=
“ABCDEFGHIJKLMNOPQRSTUVWXYZ”//26
“abcdefghijklmnopqrstuvwxyz”//26
"0123456789+/"; // 12
int base64解码编号(常量标准::字符串和输入){
//解码正数。当输入包含无效字符或溢出时返回0;
常数int N64=64;
const int overflow_LIMIT=5;//防止N64*N64*N64…>std::numeric_limits::max();
if(input.empty()| | input.size()>overflow_LIMIT)返回0;
int pos_val=1;//位置值
int结果=0;
对于(auto-itpos=input.rbegin();itpos
您得到了什么错误?您是以36为基数还是以64为基数进行编码?请选择一个。我想这可能就是您想要的:?@MalteR我想OP只对适合的情况感兴趣。
^
是异或运算符。