将字符串转换为结构(字节)
Convert String to Structure (Byte)
我使用gcrypt 结构体gcry_sexp_t (https://fossies.org/dox/libgcrypt-1.6.3/structgcry__sexp.html),我定义为typedef gcry_sexp_t Blob。
我得到一个字符串,如0069c570并将其转换为Blob (0x69c570)
- 将字符串转换为十六进制
- 将十六进制字符串放入矢量
- 尝试转换为Blob (memcpy, vector迭代器,cast)
尝试使用内存重载、迭代器或强制类型转换都没有成功。有人知道如何完成这项任务吗?
// 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(' ');
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);
This
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(' ');
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%的类型安全。
相关文章:
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- DNS 查询格式标头结构中的小字节序问题
- 哪些值存储在对齐的结构/类对象的填充字节中
- 为什么这个结构需要 24 个字节
- 正在转换结构数据的字节序
- 在C++中更改整个结构的字节序
- 使用字节数组具有单字节对齐方式的结构是否安全
- 在字节数组上转换具有虚函数的结构是否安全?
- 为什么标准库不以无锁的方式为 8 字节以下的结构实现 std::atomic?
- 将结构中的字节数组传递给 com 对象
- 为什么在未由语言本身定义的结构字节中的位字段顺序
- C 将5个字节结构与Cacheline保持一致
- C++结构到字节*引发错误
- 填充C 中C结构的填充字节?(不关心结构包装!)
- 将结构添加到字节向量,然后添加另一个
- uint12 结构中的字节序
- C 在结构中添加所有字节
- 具有3字节块的序列化C 结构
- 使用指针访问结构的各个字节
- MSVC 2008 16字节结构成员对齐奇怪