如何在C++中表示二进制字节数组数据
How to represent binary byte array data in C++?
我正在尝试使用libCQL library in C++
从Cassandra检索数据....我在 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 检索数据,以便在我尝试打印出column_name和column_value详细信息user_id = 1
。
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 表中column_value的字节数组(二进制 blob)。
我已经将键和值都声明为字符串,这可能是我在上面的代码中猜测的问题。但我相信值是卡桑德拉表(column_value)中的实际斑点。所以我不确定如何使用上面的C++代码检索二进制 blob(字节数组)?
此外,此二进制字节数组 blob 值可以是任何可变长度,并且始终以 BIG-ENDIAN 字节顺序格式存储。
来自Java背景,我遇到了一点问题...任何帮助将不胜感激...正如我猜,这完全C++问题,比如我应该使用哪种数据类型来表示二进制字节数组。
由于二进制 blob 不是字符串,因此无法将其打印为字符串。您必须手动打印"字符串"中的每个字节。
如果您想知道原因,让我们看看前三个字节:0x7f
、0xff
和 0x00
。第一个和第二个字节都不可打印,第三个字节是字符串终止符,因此如果将其打印为字符串,打印将停止。
如果你有C++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);
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 基于字节数组生成静态范围整数值
- 将字节数组转换为带有字节序问题的指针
- 找到一种有效的方法,在 2 个巨大的缓冲区上执行 MAX,每字节字节
- 使用 stbi_write_png,如何将 0 和 1 的矩形字节数组转换为单色 png 文件?
- 字节数组初始化会导致 DirectX 崩溃
- 使用 swig 追加到字节数组
- C++ 替换字节数组中项的顺序
- QDataStream 读取和写入的字节数比 QFile::length() 报告要多
- 如何从保存在 Java 中C++的字节数组中读取数字?
- 如何通过libpq c api插入字节的数组
- i2c中的字节指针数组
- 以 C++ 为单位递增 16 字节字符数组
- new[] 一个包含构造函数的字节对象数组没有错,对吧?
- 创建未知长度的字节/字符数组
- 我如何将bitset转换为字节/uint8数组
- C++ <--> C# 修改字节编组数组
- 将m个字节的数组拆分为n个字节的块
- c++到c#:有3个元素的字节指针数组等于什么?