将int数组转换为char*

5
这个可行吗?我想将它转换为char*,以便稍后检索这些值。

好的,实际上我是将它作为数据包通过网络发送的。 - seed
请注意,关闭的一个原因是“模棱两可”。 - Potatoswatter
1
@seed:不,它可能意味着将数组解释为char*或将数字转换为某些字符串。 - Georg Fritzsche
将int数组解释为char*以便通过网络传输是一个端序问题,随时可能发生(也许现在不会,但是在未来的某个时间...)。 - Mark B
@seed:也许你应该编辑一下那个问题,提供更多的信息并使其上升——特别是,你是否被困在那个特定的库中,或者还有其他选择? - Cascabel
显示剩余11条评论
5个回答

8

当然:

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);

这是保证可行的。但是,看起来你正在尝试通过网络发送东西,这可能会引入其他问题。
你要找的过程叫做序列化(并有常见问题解答)。这是将一个对象转换为一系列位,稍后可以将其“反序列化”为原始对象的过程。
使其在多个平台上运行可能会很棘手,因为您需要确保将其序列化为特定格式,并且每个平台都知道它应该如何从该格式中读取。 (例如,大端平台在发送之前可能总是将其转换为小端,同样在接收时将其转换回大端。)您不能将非POD类型视为字节流(例如std::string),因此您需要编写序列化函数来转换它们的数据为字节流,并编写反序列化函数将其转换回去。

我特别喜欢 Boost 的做法,如果可以的话,我会使用他们的序列化库。他们首先定义了用于序列化基本类型的例程,然后你可以通过构建来序列化更复杂的类型。当然,Boost 还有他们的ASIO库可以为你处理套接字。


3
问题中并没有明确表达那个意图。 - Nathan Osman
这似乎已经起作用了,但我想知道如何从中获取实际数据?例如,如果我将其打印出来,它实际上会给我一个笑脸符号(=D)- 我猜这就是1234代表的东西。我能否将其分解为1、2、3、4? - seed
1
@seed:如果它打印出笑脸符号,则表示第一个int的最后一个字节(假设采用小端序)等于笑脸符号的DOS字符值。 - Nathan Osman
2
@Frustrated:哈哈,它确实打印了一个笑脸。我很牛逼,显然已经计划好了这一切。 - GManNickG
这就是我正在做的事情,不是吗?我正在将int[]转换为char,然后再转换回int[]。 - seed
显示剩余8条评论

3

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

这样做将把整数视为字节序列。然后将这些字节传递给文件或跨套接字进行写入非常诱人。问题在于结果将不具备可移植性。无法保证读取这些字节的任何计算机将以相同的方式解释它们。最大的问题是大端和小端。某些计算机首先放置最重要的字节,而其他计算机则首先放置最不重要的字节。在它们之间切换将导致数字被反向读取。


啊,是的,我读过这个……虽然我猜这是一个非常糟糕的想法,但我会尝试一下,这更像是一个实验,而不是将要上市的东西 ;) - seed

0

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

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

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

好的,我明白了。 - seed
@seed:特别是考虑到“函数的参数只接受char*”,这似乎完全回答了你的问题。难道不是这样吗? - Potatoswatter
@potatoswatter- 是的,但我认为我只需要一种将其转回的方法。 - seed
@seed:在没有任何其他类型的规范的情况下,是的。 - Potatoswatter
@potatoswatter- 我认为可能是控制台或网络导致了数据混乱,因此我已经开了一个与网络直接相关的新线程。不过还是谢谢你的帮助! - seed
显示剩余2条评论

-1
这是你想要做的吗?
int list[5] = {1,2,3,4,5};

char * pChar = (char *)list;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接