C++ C++;将包含非人类可读数据的字符串转换为200 double
我有一个长度为1600的字符串,我知道它包含200C++ C++;将包含非人类可读数据的字符串转换为200 double,c++,C++,我有一个长度为1600的字符串,我知道它包含200double。当我打印出字符串时,我得到以下信息:Y���Vz'@��y'@��!U�}'@�-... 我想把这个字符串转换成一个包含200个双精度的向量 下面是我尝试的代码(blobString是一个1600个字符长的字符串): ---编辑解决方案--- 第二种方法有效,我所要做的就是查找double_value1指向的位置 cout << *double_value2 << endl; cout以下是一个可能让您更接
double
。当我打印出字符串时,我得到以下信息:Y���Vz'@��y'@��!U�}'@�-...代码>
我想把这个字符串转换成一个包含200个双精度的向量
下面是我尝试的代码(blobString
是一个1600个字符长的字符串):
---编辑解决方案---
第二种方法有效,我所要做的就是查找double_value1指向的位置
cout << *double_value2 << endl;
cout以下是一个可能让您更接近所需的示例。记住,除非你的BLB中的数字是你的特定C++编译器所期望的精确格式,否则这不会像你预期的那样工作。在我的例子中,我自己在建立双打的缓冲区
让我们从双打开始
double doubles[] = { 0.1, 5.0, 0.7, 8.6 };
现在,我将构建一个类似于您的blob的std::string
。请注意,我不能简单地用指向双精度列表底部的(char*)
初始化字符串,因为当它到达第一个零字节时,它将停止
std::string double_buf_str;
double_buf_str.append((char *)doubles, 4 * sizeof(double));
// A quick sanity check, should be 32
std::cout << "Length of double_buf_str "
<< double_buf_str.length()
<< std::endl;
根据您的情况,您可以考虑使用<代码> STD::vector 用于BLUB,而不是使用<代码> STD::String 。C++11为您提供了一个
data()
函数,该函数相当于C_str()
。将blob直接转换为double向量将使您更容易处理—但要实现这一点,您可能需要将调整大小
,然后将memcpy
直接插入内部数组,从而弄脏
我给你举一个完整性的例子。请注意,这当然不是通常初始化double向量的方式……我想象我的double\u blob
只是一个指向包含正确格式的已知double数的blob的指针
const int count = 200; // 200 doubles incoming
std::vector<double> double_vec;
double_vec.resize(count);
memcpy(double_vec.data(), double_blob, sizeof(double) * count);
for (double& d : double_vec) {
std::cout << d << std::endl;
}
const int count=200;//200双进
std::向量双_-vec;
双矢量调整大小(计数);
memcpy(double_vec.data(),double_blob,sizeof(double)*count);
用于(双d:double_vec){
std::cout第一个方法看起来正确(如果字节是相同的endian)你怎么知道这些值是正确的/不正确的?请注意,double\u value2
是一个指针,而不是一个双精度值,并且输出的e320
与你的程序代码不匹配。在cout@RichardCritten中是这样做的吗?first\u-eight
是一个std::string
,而不是一个数组。请仔细阅读这个问题。std::string
不容易复制,所以string
地址上的memcpy
不起作用。谁知道sting是如何实现的。可能是一个指针和一个计数。可能是一对指针和一个用于短字符串优化的缓冲区,Crom只知道memcpy
将实际复制什么。memcpy
ingstd::string::data
可以工作,假设endian与源计算机和当前计算机使用的编码匹配。警告-如果您不是使用同一台计算机读/写数据,您可能最终会遇到endian问题(位的顺序会发生变化)。我认为(double*)double_buf_str.c_str()
在技术上是不安全的,不是有对齐要求吗?如果我错了,有人可以纠正我,但我的理解是,新的或malloc的内存块保证根据最大标准类型的要求对齐,例如long-long。但我明天会研究这一点,并肯定会看到。(A)你是对的,我忽略了(B)不能保证.c_str()
是对齐的。GCC将元数据放在分配的开头,放在字符串字符之前。我会确定地签出,但如果元数据struct+字符串打包为小于8字节的对齐方式,我会非常惊讶。(当然,标准是否保证这一点是另一回事。)
std::string double_buf_str;
double_buf_str.append((char *)doubles, 4 * sizeof(double));
// A quick sanity check, should be 32
std::cout << "Length of double_buf_str "
<< double_buf_str.length()
<< std::endl;
for (auto i = 0; i < 4; i++) {
std::cout << ((double*)double_buf_str.c_str())[i] << std::endl;
}
const int count = 200; // 200 doubles incoming
std::vector<double> double_vec;
double_vec.resize(count);
memcpy(double_vec.data(), double_blob, sizeof(double) * count);
for (double& d : double_vec) {
std::cout << d << std::endl;
}