2013-07-31 33 views
1

我有一个固定长度的浮点数组。现在我想将该数组转换为二进制字符串。C++ - 将浮点数组转换为std :: string

我不能使用const char *,因为我的字符串将包含空字节。在那种情况下我将如何使用memcpy?我已经尝试过reinterpret_cast<string *>,但这样做不起作用,因为字符串也只是存储指向数据开始和结束的指针(如果我错了,请纠正我)。

我已经构建一个空字符串:

string s; 
s.resize(arr_size); 

但我怎么会花车的阵列复制到该字符串?

基本上,我想将固定浮点数组的内存区域转储为字符串。

不要硬和我在一起,我还在学习C++

回答

5

像这样:

#include <algorithm> 
#include <string> 

float data[10]; // populate 

std::string s(sizeof data); 
char const * p = reinterpret_cast<char const *>(data); 

std::copy(p, p + sizeof data, &s[0]); 

注意sizeof data相同10 * sizeof(float),即在字节数阵列。

更新:正如詹姆斯所说,你甚至可以做的更好,这一切写在一气呵成:

char const * p = reinterpret_cast<char const *>(data); 
std::string s(p, p + sizeof data); // beginning + length constructor 

甚至:

#include <iterator> 

std::string s(reinterpret_cast<char const *>(std::begin(data)), // begin + end 
       reinterpret_cast<char const *>(std::end(data))); // constructor 
+0

如果使用字符串的两个迭代器构造,你不必担心尺寸。 –

+0

我得到'警告C4996'(但我认为这是确定)..但我也越来越'错误C3892 - 你不能分配给一个变量是const' ..也许这是因为s.data()是常量? – tobspr

+0

@ H2CO3那是怎么回事?或者您正在与阵列的定义调用它,在这种情况下,可以使用'的std ::开始()'和'的std ::端()'(或在工具包等同于预C++ 11 ),或者你在一个已经传递了指针的函数中,在这种情况下,该函数也可以使用一个长度(在元素中)或一个结束指针。 –

4

获取所有的字节排成一串很容易:

std::string 
bitwiseDump(float const* begin, float const* end) 
{ 
    return std::string(reinterpret_cast<char const*>(begin), 
         reinterpret_cast<char const*>(end)); 
} 

但是为什么?除了将 复制到相同类型的数组之外,您无法对字符串进行任何操作。 (即使对于使用 std::vector<char>std::vector<unsigned char>会 更自然,而且少混淆。)

+0

我使用它需要的顶点数据作为二进制字符串:) – tobspr

+0

图形引擎这应该是:-) –

+3

你的意思是它需要一个'的std :: string'二进制数据作为参数模板?这是一个设计非常糟糕的界面。 –

0

看看这个...

#include <iostream> 
#include <array> 
#include <string> 

int main() 
{ 
    std::string floatString; 
    std::array<float, 5> data = {1.1f, 2.2f, 3.3f, 4.4f, 5.5f}; 

    for (auto& element : data) 
     floatString.append(std::to_string(element)); 

    std::cout << floatString; 
    std::cin.get(); 
} 
+0

我的错,我也没有看到OP想要用二进制表示来得到它... –