C++ 将int数组转换为char*

C++ 将int数组转换为char*,c++,C++,这可能吗?我想将其转换为字符*,以便以后检索此值。确定: int array[4] = {1, 2, 3, 4}; char* c = reinterpret_cast<char*>(array); 这是保证工作。但是,您似乎试图通过网络发送内容,这可能会带来其他问题 您正在寻找的进程称为序列化(并且具有。这是当您获取一个对象时,将其转换为一系列位,这些位稍后可以“反序列化”为原始对象 要在多个平台上实现这一点可能很棘手,因为您需要确保序列化为特定格式,并且每个平台都知道应该如何

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

确定:

int array[4] = {1, 2, 3, 4};
char* c = reinterpret_cast<char*>(array);
这是保证工作。但是,您似乎试图通过网络发送内容,这可能会带来其他问题


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

要在多个平台上实现这一点可能很棘手,因为您需要确保序列化为特定格式,并且每个平台都知道应该如何读取该格式。(例如,big-endian平台可能在发送前总是转换为little-endian,在接收时也会转换回big-endian。)您不能将非POD类型视为字节流(例如
std::string
),因此您需要为这些类型编写序列化函数,将其数据转换为字节流,和反序列化函数将其转换回


我特别喜欢Boost这样做,如果可以的话,我会使用他们的。它们基本上首先定义用于序列化基本类型的例程,然后您可以通过构建这些例程来序列化更复杂的类型。当然,Boost也为您提供了自己的to do套接字。

这就是您想要做的吗

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

char * pChar = (char *)list;

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

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

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


这样做会将int视为字节序列。然后将这些字节传递给文件或跨套接字写入。问题是结果不可移植。无法保证任何读取这些字节的计算机都会以相同的方式对其进行解释。最大的问题是大端对小端。本质上,一些计算机将最高有效字节放在第一位,而另一些计算机将最低有效字节放在第一位。在它们之间切换将导致向后读取数字

如果需要字符串,请使用
std::string
,而不是
char*
。如果要序列化,请使用

#包括
std::ostringstream数据包操作系统;
对于(int i=0;i<5;++i)数据包_os>arr[i];
断言(数据包_是);//对于调试,请检查接收的所有内容是否正常

你能澄清一下你在找什么吗?您想要一个包含数字的字符串数组吗?你想一次访问你的int的一个字节吗?只要我以后能检索到所有的int,几乎什么都可以。你想在函数返回后保留数据吗?嗯,实际上我是通过网络将其作为数据包发送的。@seed:不,这可能意味着将数组解释为
char*
或将数字转换为字符串。理想情况下,数组中的最后一个元素应为零,以防有人将char*传递给str*函数,但问题中并未明确说明其意图。这似乎起到了作用,但我只是想知道——我如何从中获得实际数据?例如,如果我把它打印出来,它实际上给了我一个笑脸符号(=D)——我猜这就是1234所代表的东西。我真的可以把它反汇编成1,2,3,4吗?@seed:如果它打印一个笑脸,这意味着第一个int的最后一个字节(假设小endian)等于该笑脸的DOS字符值。@failured:哈哈,它完全可以打印一个笑脸。我是个坏蛋,我清楚地计划好了。啊,是的,我读到了。。。。虽然我认为这是一个非常糟糕的主意,但我还是要尝试一下,这更像是一个实验,而不是上市的东西;)@抱歉,我在你写问题注释的时候写了一个代码注释。好的,我明白了。(没有足够的字符,所以我会把它放进去。)@seed:特别是考虑到“函数的参数只接受字符*”,这似乎完全回答了你的问题。不是这样吗?@potatoswatter-是的,但我想我需要一种方法把它转回去。@potatoswatter-我猜网络发送是伪函数?
int arr[] = {0, 1, 2, 3, 4};
char* p_arr = reinterpret_cast<char*>(arr);
#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