我使用gcrypt struct gcry_sexp_t (https://fossies.org/dox/libgcrypt-1.6.3/structgcry__sexp.html)我定义为 typedef gcry_sexp_t Blob 。
我得到一个字符串,例如 0069c570 并将其转换为Blob(0x69c570)
使用memcpy,迭代器或强制转换的尝试都没有奏效。有谁知道如何完成这项任务?
// Convert to Hex String
std::stringstream vstream;
vstream << std::hex << std::setw(2) << std::setfill('0');
for (size_t i = 0; size > i; ++i) {
vstream << static_cast<unsigned int>(static_cast<unsigned char>(value[i]));
}
std::string valuestr = vstream.str();
valuestr.replace(0, 2, "0x");
// Place into std::vector
std::transform(valuestr.begin(), valuestr.end(), valuestr.begin(), ::tolower);
std::vector<char> bytes(valuestr.begin(), valuestr.end());
bytes.push_back('\0');
char *rcvdblob = (char *)&bytes[0];
// Attempt to convert to Blob
Blob rcvdpayload;
memcpy(&rcvdpayload, &bytes[0], sizeof(rcvdpayload));
for (std::vector<char>::iterator it = bytes.begin(); it != bytes.end(); ++it) {
std::cout << *it;
}
std::cout << std::endl;
rcvdpayload = *reinterpret_cast<Blob*>(rcvdblob);
答案 0 :(得分:0)
此
std::string valuestr = vstream.str();
valuestr.replace(0, 2, "0x");
覆盖你的第一个十六进制。你确定要这么做吗?
此
std::transform(valuestr.begin(), valuestr.end(), valuestr.begin(), ::tolower);
std::vector<char> bytes(valuestr.begin(), valuestr.end());
bytes.push_back('\0');
char *rcvdblob = (char *)&bytes[0];
完全没必要,因为(1)你知道你的字符串只由小写的十六进制字符组成,字母'x'和(2)你可以访问使用valuestr.c_str()
下面
memcpy(&rcvdpayload, &bytes[0], sizeof(rcvdpayload));
自从gcry_sexp
声明为。
struct gcry_sexp {
byte d[1]; // I assume byte is typedefed as unsigned char or such
};
在具体案例中,d []可能更大。我猜结构只是一个数组的占位符,可能至少是1号。不是一种不常见的做法,但当然不是100%类型安全的人可能会说。