Как представить данные двоичного массива байтов в C ++?

0

Я пытаюсь извлечь данные из Cassandra с libCQL library in C++... Таблица, которую я создал в Cassandra, похожа на это:

create table test_cql (user_id text, column_name text, column_value blob, primary key (id, column_name));

И ниже приведены данные, приведенные в приведенной выше таблице -

cqlsh:testks> select column_name, column_value from test_cql where user_id = '1';

 column_name              | column_value
--------------------------+--------------------------------------------------------------------------------------------
 @hello.1381780131229.dc1 | 0x7fff0000012c4ebb95550000001e42797465204172726179205465737420466f722042696720456e6469616e

Здесь column_value - это фактическое значение blob, которое я пытаюсь извлечь...

Ниже приведен код C++, который будет пытаться извлечь данные из Cassandra для user_id = 1 в котором я пытаюсь распечатать данные column_name и column_value.

    bool flag = false;
    std::map<std::string, std::string> m;
    std::string key, value;

    string query = "select column_name, column_value from test_cql where user_id ='1';";
    std::cout << query << endl;

// the below line will execute the query
    cql_result_t& result = execute_query(query);

// this will print out the result after executing the above query

    while (result.next()) {
        for (size_t i = 0; i < result.column_count(); ++i) {
            cql::cql_byte_t* data = NULL;
            cql::cql_int_t size = 0;
            result.get_data(i, &data, size);

            if (!flag) {
                key = reinterpret_cast<char*>(data);
                flag = true;
            } else if (flag) {
                value = reinterpret_cast<char*>(data);
                m[key] = value;
                flag = false;
            }
        }

        cout<<key << "-" << value <<endl;

    }

Вышеприведенный код только выводит ключ как @hello.1381780131229.dc1 но не как-то значение. Он должен печатать значение как 0x7fff0000012c4ebb95550000001e42797465204172726179205465737420466f722042696720456e6469616e поскольку это значение представляет собой массив байтов (двоичный код) в таблице Cassandra, который является столбцом_значения.

И я объявил ключ и значение как строку, которая может быть проблемой, я думаю, в моем предыдущем коде.. Но я считаю, что значение является фактическим blob в таблице Cassandra (column_value). Поэтому я не уверен, как извлечь двоичный код ( байтовый массив) с использованием кода C++?

А также это значение двоичного байтового байтового массива может иметь любую переменную длину и всегда хранится в байтовом формате BIG-ENDIAN.

Исходя из фона Java, у меня мало проблем... Любая помощь будет оценена по этому поводу... Как я думаю, его полностью C++ вопрос, какой тип данных я должен использовать для представления двоичного байтового массива.

Теги:
endianness
bytearray

1 ответ

1
Лучший ответ

Поскольку двоичный blob не является строкой, поэтому вы не можете печатать его как строку. Вы должны вручную напечатать каждый байт в строке.

Если вам интересно, почему, давайте посмотрим на три первых байта: 0x7f, 0xff и 0x00. Ни первый, ни второй байт не могут быть напечатаны, а третий байт является ограничителем строк, поэтому, если вы напечатаете его как строку, печать остановится там.

Если у вас есть С++ 11, вы можете сделать что-то вроде

std::cout << "Value = 0x";
for (const char& byte : value)
    std::cout << std::hex << static_cast<int>(byte);
std::cout << std::endl;

Существует также проблема, которую вы пытаетесь использовать в качестве строки, которая не работает (как описано выше). Вы можете использовать std::string, но вы должны использовать конструктор:

value = str::string(reinterpret_cast<char*>(data), size);

Если данные на самом деле являются структурой, то вы можете использовать для нее структуру:

struct employee
{
    uint16_t id;
    uint8_t lastModifiedDate[8];
    std::string value;
};

...

std::map<std::string, employee> m;

...

m[key].id = *reinterpret_cast<uint16_t*>(data);
std::copy(reinterpret_cast<uint8_t*>(data + 2),
          reinterpret_cast<uint8_t*>(data + 10),
          m[key].lastModifiedData);
m[key].value = std::string(reinterpret_cast<char*>(data + 10), size - 10);
  • 0
    Спасибо за предложение .... Вы указали наши более тонкие детали .. Позвольте мне объяснить вам более подробно ... Этот байтовый массив состоит из - первые два байта будут содержать мой employeeId , следующие 8 байтов будут lastModifiedDate а остальные байты мое actual value ... Так как вы сказали, мне нужно вручную распечатать каждый байт .. Можно ли извлечь первые два байта, затем следующие восемь байтов, а затем оставшиеся байтовые значения из этого байтового массива? ПРИМЕЧАНИЕ. Этот байтовый массив имеет формат байтов с прямым порядком байтов.
  • 0
    А также, что здесь ch ?
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню