我正在使用一个系统,我可以一次发送1 32位int。但是我需要一次发送两个号码。在标准C中执行此操作的最佳方法是什么?
我假设我必须转换为二进制/十六进制和一些屏蔽?
任何想法都会受到赞赏。
由于
答案 0 :(得分:4)
您可以编码两个16位无符号数字,如下所示:
unsigned int out = (in1 << 16) | in2;
并像这样解码它们:
unsigned int in1 = out >> 16;
unsigned int in2 = out & 0xFFFF;
所有这一切假设int
至少为32位,in1
和in2
在0-65535范围内,并且unsigned int
可以发送正确(wrt endianness)。
答案 1 :(得分:2)
如果您发送的号码在0到65535之间,则只需将它们打包成您可以发送的32位数据集:
unsigned int n1 = 42;
unsigned int n2 = 1600;
unsigned int numbertosend = (n1 << 16) | n2;
在接收方,打开号码
unsigned int n1 = receivednumber >> 16;
unsigned int n2 = receivednumber & 0xFFFF;
答案 2 :(得分:1)
您的号码在哪个范围内?如果它们可以适合16位,那么你可以打包32位int中的两个。类似于i = (n1 << 16) | (n2 &0xffff)
。
答案 3 :(得分:1)
您可以将2个16位数字编码为32位数字。 例如:
int32 encode(int16 numA, int16 numb) {
int 32 result = numA << 16 | numB;
return result;
}
int16 decodeNum1(int32 num) {
return (num >> 16) & 0xFFFF;
}
int16 decodeNum2(int32 num) {
return (num) & 0xFFFF;
}
答案 4 :(得分:1)
如果您要发送的两个号码都是素数,您可以将它们相乘并发送产品,然后在服务器上对它们进行因子分析以获得结果。
; p(受到问题中含糊不清的启发)
答案 5 :(得分:0)
假设您要发送2个16位数字,您可能会执行以下操作:
unsigned int a, b, toSend;
// Give a and b a value...
toSend = ( a << 16 ) | b;
答案 6 :(得分:0)
我认为Unions in c 会做的。你也可以去Bit Fields in C