2015-05-21 3 views
0

Я с помощью gcrypt STRUCT gcry_sexp_t (https://fossies.org/dox/libgcrypt-1.6.3/structgcry__sexp.html), которые я определяю как ЬурейеГо gcry_sexp_t Blob.Преобразовать Строку Структуры (байты)

Я получаю строку, как показано 0069c570 и преобразовать его в Blob (0x69c570)

  1. Преобразования строку в HEX
  2. Места шестнадцатеричной строки в вектор
  3. Попытки Преобразовать в Blob (тетср, векторный итератор, литье)

Попытки использовать memcpy, iterators или 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('\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

Если возникла проблема, которая может быть решена более четко, лаконично и быстрее в C, чем C++, для нее это ребенок-плакат. –

ответ

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) вы знаете, что ваша строка состоит только из строчных шестнадцатеричных символов и букв «х» и (2) вы получите доступ к продолжает последовательность '\ 0' расторгнут полукокса с помощью 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% -ная типизация, которую можно сказать.

+0

Вы правы. Я объявляю структуры 2 ** Blob ** (gcry_sexp_t) и копирую их через memcpy (** memcpy (& rcvdpayload, & encpayload, sizeof (Blob)); **). Затем я могу использовать функцию, такую ​​как ** gcry_sexp_dump **, чтобы проверить, что контент тот же. Затем я упростил все, чтобы выполнить memcpy на valuestr, используя ** memcpy (& rcvdpayload, valuestr.c_str(), sizeof (Blob)); **. В valuestr.c_str() есть, например, текст: ** 00696f30 **. После memcpy ** Blob rcvdpayload ** имеет значение ** 0x3033663639363030 **, то есть шестнадцатеричное представление, но в обратном порядке. Мне нужно будет поработать над этой проблемой. –

Смежные вопросы