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

时间:2015-05-21 05:31:11

标签: c++ vector type-conversion stringstream

我使用gcrypt struct gcry_sexp_t https://fossies.org/dox/libgcrypt-1.6.3/structgcry__sexp.html)我定义为 typedef gcry_sexp_t Blob

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

  1. 将字符串转换为HEX
  2. 将十六进制字符串放入向量
  3. 尝试转换为Blob(memcpy,vector iterator,cast)
  4. 使用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);
    

1 个答案:

答案 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()

连续的'\ 0'终止char序列

下面

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%类型安全的人可能会说。