C++ C++;将包含非人类可读数据的字符串转换为200 double

C++ C++;将包含非人类可读数据的字符串转换为200 double,c++,C++,我有一个长度为1600的字符串,我知道它包含200double。当我打印出字符串时,我得到以下信息:Y���Vz'@��y'@��!U�}'@�-... 我想把这个字符串转换成一个包含200个双精度的向量 下面是我尝试的代码(blobString是一个1600个字符长的字符串): ---编辑解决方案--- 第二种方法有效,我所要做的就是查找double_value1指向的位置 cout << *double_value2 << endl; cout以下是一个可能让您更接

我有一个长度为1600的字符串,我知道它包含200
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
ing
std::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;
}