将字符串转换为结构(字节)

Convert String to Structure (Byte)

本文关键字:字节 结构 字符串 转换      更新时间:2023-10-16

我使用gcrypt 结构体gcry_sexp_t (https://fossies.org/dox/libgcrypt-1.6.3/structgcry__sexp.html),我定义为typedef gcry_sexp_t Blob

我得到一个字符串,如0069c570并将其转换为Blob (0x69c570)

  1. 将字符串转换为十六进制
  2. 将十六进制字符串放入矢量
  3. 尝试转换为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%的类型安全。