1

我的问题有点奇怪。我给出了一个客户端-服务器应用程序,其中在客户端中设计了一个结构,它包含一个大小为 的字符数组char values[1000]。我将收到来自服务器的 1000 位0's and 1's. 在那我想从885 and 886's position. 如何正确执行此操作?因为当我在那个位置阅读时,我得到了奇怪的字符。我认为这是因为这些位是作为海量数据存储在该values[]数组中的values[1000]={111010101....1},而不是像普通的 array-> 一样int abc[2] = {1,2};

这是原因吗?那我怎么885 and 886's positionsvalues[1000]={111010101....1}

请澄清...

4

3 回答 3

4

这里似乎有很多混乱。

假设 8 位chars 只是为了减少混淆,第 885 位和第 886 位将在字符 110 中(从 0 开始计数,即第 81 个字符)。

如果我们将 LSB 中的位索引为位 0,则该字符中包含以下位:

       88888888
bit nr 88888888
       76543210
        **

垂直阅读,我们发现 885 和 886 用星号 ( *) 表示。

因此,要提取这两个位:

const int bit885 = (values[110] & 0x20) >> 5;
const int bit886 = (values[110] & 0x40) >> 6;
于 2013-07-02T08:33:25.083 回答
2

您的 char 数组在每个位置包含 8 位,因为 char 占用一个字节。我想你从服务器收到一个字节流?这意味着每个位置占用 8 位,您必须通过除法找到正确的位置,例如:

char c = values[885/8];

在此之后仍然必须移动或屏蔽这 8 位中的正确位。您可以通过模除法找到位位置:885 % 8

读取位和字节以及位操作(和、或、移位)

还要检查您的数据是如何在服务器上接收的以及您收到的字节数

于 2013-07-02T08:33:13.047 回答
1

假设您每单存储 8 位char,则可以通过这种方式完成。它是我们PIN在 ARM 中使用寄存器的方式。

int bitState = 0;
char buff[1000];

//Some execution that updates the buff

bitState = ((buff & (1 << 885)) ? 1 : 0);
if(bitState)
  //DO this;
else
  //DO that;

bitState = ((buff & (1 << 886)) ? 1 : 0);
if(bitState)
  //DO this;
else
  //DO that;
于 2013-07-02T10:41:47.333 回答