【问题标题】:Convert String to Structure (Byte)将字符串转换为结构(字节)
【发布时间】:2015-05-21 05:31:11
【问题描述】:

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

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

  1. 将字符串转换为十六进制
  2. 将十六进制字符串放入向量中
  3. 尝试转换为 Blob(memcpy、向量迭代器、强制转换)

使用 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);

【问题讨论】:

  • 如果有什么问题可以用 C 比 C++ 更清楚、更简洁、更快速地解决,这就是它的典型代表。

标签: c++ vector type-conversion stringstream


【解决方案1】:

这个

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' 终止字符的连续序列

这里

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

【讨论】:

  • 你是对的。我声明了 2 个 Blob (gcry_sexp_t) 结构并通过 memcpy (memcpy(&rcvdpayload, &encpayload, sizeof(Blob));) 复制它们。然后我可以使用诸如 gcry_sexp_dump 之类的函数来验证内容是否相同。然后我简化了一切,使用 memcpy(&rcvdpayload, valuestr.c_str(), sizeof(Blob)); 对 valuestr 执行 memcpy。值str.c_str() 具有例如文本:**00696f30**。在 memcpy 之后,Blob rcvdpayload 的值 0x3033663639363030 是十六进制表示,但顺序相反。我需要解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2021-06-28
  • 2019-10-10
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 2022-01-18
相关资源
最近更新 更多