将int数组转换为char *

时间:2010-04-22 03:32:38

标签: c++

这可能吗?我想将其转换为char *,以便稍后检索此值。

5 个答案:

答案 0 :(得分:7)

不确定

int array[4] = {1, 2, 3, 4};
char* c = reinterpret_cast<char*>(array);

有效范围是cc + sizeof(array)。您可以对任何POD类型执行此操作。

您可以从一系列字节转换回来:

// assuming c above
int (&pArray)[4] = *reinterpret_cast<int(*)[4]>(c);

这保证可行。但是,您似乎正在尝试通过网络发送内容,这可能会引入其他问题


您正在寻找的流程称为序列化(并且具有FAQ entry)。这是当您获取一个对象时,将其转换为一系列位,以后可以将其“反序列化”到原始对象中。

跨多个平台进行此项工作可能会非常棘手,因为您需要确保序列化为特定格式,并且每个平台都知道它应该如何从该格式读取。 (例如,big-endian平台在发送之前可能总是转换为little-endian,并且在接收时也会转换回big-endian。)您不能将非POD类型视为字节流(例如{{1}因此,您需要为这些函数编写序列化函数,将其数据转换为字节流,然后使用反序列化函数将其转换回来。

我特别喜欢Boost这样做,如果你能使用他们serialization library。它们基本上首先定义用于序列化基本类型的例程,然后通过构建它来序列化更复杂的类型。当然,Boost也有ASIO library为你做套接字。

答案 1 :(得分:3)

是的,但你可能不应该这样做。

这样做会将整数视为字节序列。然后将这些字节传递给文件或通过套接字传递是很诱人的。问题是结果不可移植。无法保证任何计算机读取这些字节都会以相同的方式解释它们。最大的问题是big-endian vs little-endian。实质上,一些计算机首先放置最重要的字节,而其他计算机将最低有效字节放在第一位。在它们之间切换将导致数字被向后读取。

答案 2 :(得分:0)

您可以使用C风格,但在C ++中:

int arr[] = {0, 1, 2, 3, 4};
char* p_arr = reinterpret_cast<char*>(arr);

答案 3 :(得分:0)

如果您想要字符串,请使用std::string,而不是char*。如果您想要序列化,请使用<stringstream>

#include <stringstream>

std::ostringstream packet_os;
for ( int i = 0; i < 5; ++ i ) packet_os << arr[ i ] << " ";
network_send( packet_os.str().c_str() ); // c_str() returns char*

另一端:

network_receive( recv_buf );
std::istringstream packet_is( recv_buf->bytes );
for ( int i = 0; i < 5; ++ i ) packet_is >> arr[ i ];
assert ( packet_is ); // for debugging, check that everything was received OK

答案 4 :(得分:-1)

你想要做什么?

int list[5] = {1,2,3,4,5};

char * pChar = (char *)list;