流程说,PA希望通过在用值填充后以char buf形式将其发送给PB来将2个整数的值发送给PB。假设PA和PB在同一台机器上。 PB知道它读取的缓冲区包含2个整数的值。

uint x=1;

uint y=65534;



情况1


PA写入char buf,如下所示

sprintf(buff,"%d%d",x,y);


Q1-在这种情况下,PB仅包含一个包含1,6,5,5,3,4的数组,因此PB如何将其值提取为1和65534。使用sprintf是问题吗?


情况二


PA使用itoa函数在缓冲区中填充整数值。
PB使用atoi从缓冲区中提取值。
由于itoa在每个值之后放置一个空终止符,因此这应该是可能的。

问题2-现在考虑PA在32位机器上以4字节int大小运行,而PB在16位机器上以2字节int大小运行。仅检查范围是否会使我的代码可移植?

问题3-memcpy是这样做的另一种方式吗?

问题4-通常如何进行?

最佳答案

1)接收器将从网络中读取字符串值,并进行自己的转换;在这种情况下,它将获得165,534的字符串表示形式。您需要某种方法来分隔接收器的值。

2)检查是否超出范围是一个好的开始,但是可移植性取决于更多因素,例如定义传输格式(二进制或文本格式)。

3)

4)通常是通过确定数字的二进制表示标准来完成的,即是否是有符号/无符号的16/32/64位值,然后将其转换为通常称为网络字节序的数字发送方,并在接收方将其转换为主机字节顺序。

[1] http://en.wikipedia.org/wiki/Network_byte_order#Endianness_in_networking

关于c - IPC的sprintf或itoa或memcpy,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9499962/

10-11 22:10