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]?非常感谢您的光临!