1

所以我有以下具有 5 个值的 Int 数组

int guess[5]= { 1 , 4 , 7 , 3 , 0 } // Testguess

我最终想要的是一个 uint16,或者实际上是 2 个 uint8 值,以二进制形式表示这些值。LSB(第 15 位)用于现在无关紧要的标志。最后,我想通过套接字传输此消息。

因此,对于上述值,我想得到以下消息:(我将用空格分隔不同的值以使其更清晰)

X 000 011 111 100 001

请注意,这些值是从右到左的。

X 是一个标志,基本上是所有位的异或,但我想我可以自己解决这个问题。

我对 C 很陌生,想知道以下任务的良好解决方案。

  • 如何将 int Array 的值转换为二进制文件?
  • 如何将这些二进制值写入 uint16?
  • 如何将此结果 uint16 拆分为 2 个 uint8s?

我几乎没有找到解决这个问题的好方法。我正在考虑使用范围为 3 的移位进行写作,但我不确定如何获取这些二进制文件,也许是在做 & 0x2 之类的?

就像我说的那样,我对 C 语言还是很陌生,并且很高兴得到每一次帮助。

4

3 回答 3

2

使用一些位移:

int guess[5]= { 1 , 4 , 7 , 3 , 0 } // Testguess
int output = 0;
for (int i = 0; i < 5; ++i)
{
    output |= (guess[i] & 0x7) << (i * 3);
}
于 2013-11-06T21:14:11.547 回答
2

使用所需类型的指针应该可以正常工作。

for(int i = 0; i < 5; i++) {
    uint8_t* x = (void*) guess[i];
}

但是正如前面其他人所说,因为您的目标是获得用于网络的二进制表示,您可能希望为该任务使用适当的函数。

有些架构是小端,有些是大端,而网络标准只是其中之一。

于 2013-11-06T21:16:52.137 回答
2

每个guess[].

int guess[5]= { 1 , 4 , 7 , 3 , 0 } // Testguess
uint16_t y = 0;
unsigned i;
for (i = 0; i < 15; i += 3) {
  y |= (guess[i] & 7) << i;
}
if (tbd()) { // set the X bit
  y |= 0x8000; 
}
uint8_t lsbyte = (uint8_t) y;
uint8_t msbyte = (uint8_t) (y >> 8);
于 2013-11-06T21:23:47.127 回答