Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将base64解码字符串转换为无符号字符[32]_C++_Type Conversion_Base64_Ed25519 Donna - Fatal编程技术网

C++ 将base64解码字符串转换为无符号字符[32]

C++ 将base64解码字符串转换为无符号字符[32],c++,type-conversion,base64,ed25519-donna,C++,Type Conversion,Base64,Ed25519 Donna,我用数字签名 键是无符号字符[32],签名是无符号字符[64] 我找到了,但它只解码成字符串 我已经发现并尝试了许多技术,但仍然不确定如何转换 如何将base64解码的字符串转换为无符号字符[32]?Gracchus: 给你。享受吧 #include <iostream> #include <string> struct BASE64_DEC_TABLE { signed char n[256]; BASE64_DEC_TABLE() {

我用数字签名

键是
无符号字符[32]
,签名是
无符号字符[64]

我找到了,但它只解码成
字符串

我已经发现并尝试了许多技术,但仍然不确定如何转换

如何将base64解码的
字符串
转换为
无符号字符[32]

Gracchus:

给你。享受吧

#include <iostream>
#include <string>

struct BASE64_DEC_TABLE {
    signed char n[256];

    BASE64_DEC_TABLE() {
        for(int i=0; i<256; ++i)    n[i] = -1;
        for(unsigned char i='0'; i<='9'; ++i) n[i] = 52+i-'0';
        for(unsigned char i='A'; i<='Z'; ++i) n[i] = i-'A';
        for(unsigned char i='a'; i<='z'; ++i) n[i] = 26+i-'a';
        n['+'] = 62;
        n['/'] = 63;
    }
    int operator [] (unsigned char i) const { return n[i]; }
};

size_t Base64Decode(const std::string& source, void* pdest, size_t dest_size) {
    static const BASE64_DEC_TABLE b64table;
    if(!dest_size) return 0;
    const size_t len = source.length();
    int bc=0, a=0;
    char* const pstart = static_cast<char*>(pdest);
    char* pd = pstart;
    char* const pend = pd + dest_size;
    for(size_t i=0; i<len; ++i) {
        const int n = b64table[source[i]];
        if(n == -1) continue;
        a |= (n & 63) << (18 - bc);
        if((bc += 6) > 18) {
            *pd = a >> 16; if(++pd >= pend) return pd - pstart;
            *pd = a >> 8;  if(++pd >= pend) return pd - pstart;
            *pd = a;       if(++pd >= pend) return pd - pstart;
            bc = a = 0;
    }    }
    if(bc >= 8) {
        *pd = a >> 16; if(++pd >= pend) return pd - pstart;
        if(bc >= 16) *(pd++) = a >> 8;
    }
    return pd - pstart;
}

int main() {
    std::string base64_string = "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8=";
    unsigned char decoded_data[32] = {0};

    Base64Decode(base64_string, decoded_data, sizeof(decoded_data));

    for(auto b : decoded_data) {
        std::cout << static_cast<unsigned>(b) << ' ';
    }
    std::cout << std::endl;
    return 0;
}
#包括
#包括
结构BASE64_DEC_表{
符号字符n[256];
BASE64_DEC_表(){
for(inti=0;i8;if(++pd>=pend)返回pd-pstart;
*pd=a;如果(++pd>=pend)返回pd-pstart;
bc=a=0;
}    }
如果(bc>=8){
*pd=a>>16;如果(++pd>=pend)返回pd-pstart;
如果(bc>=16)*(pd++)=a>>8;
}
返回pd-pstart;
}
int main(){
std::string base64_string=“AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8=”;
无符号字符解码的_数据[32]={0};
base64解码(base64_字符串、解码_数据、sizeof(解码_数据));
用于(自动b:解码的_数据){

Std::Cuth> P>一种更有效的Base64解码方案,使用Boost C++库。Boost C++库中的BASE64解码功能可以在:

不需要转换。它的基础已经是代码>无符号char */Cube >,并且可以被设计为“代码>无符号char const */COD>”。
unsigned char const*
参数,其中
var
被声明为
unsigned char var[32];
并正确加载二进制密钥/signature.Ah。这就更有意义了。已经有过多的base64编码/解码实现。通常,您的加密API都有一个(Microsoft CryptoAPI和OpenSSL当然可以)。如果您正在寻找一个合理的实现。简单地从向量或平面数组而不是文件向其提供数据并不十分困难,而且它非常可靠。如果它们是
std::string
的话,您应该能够使用任何传递字符串的base64解码算法
c_str()
长度()
分别。最终都是字符串到字节或字节到字符串。@WhozCraig谢谢!我会尝试的!@WhozCraig我很抱歉,但我仍然无法解决这个问题。我尝试了
strncpy
和许多其他方法。我就是弄不懂。你介意发布一个如何将
字符串
转换为
的快速示例吗签名字符[32]
未签名字符[64]?非常感谢您的光临!