【问题标题】:Getting byte values from an array and merging them.从数组中获取字节值并合并它们。
【发布时间】:2013-06-06 02:49:23
【问题描述】:

我有一个蓝牙模块,它正在向我的手机发送一个 10 BYTE 阵列数据包。

我需要获取前两个字节 (0, 1) 并将它们合并在一起并将它们发送到图形查看器。 (0 = 高字节 1 = 低字节)。

字节长 12 位。

这是我目前的尝试:

// streamDelegate gave us some data, hand it over to print out
 - (void)receivedData:(uint8_t *)data length:(NSUInteger)len {

uint16_t iChanI = 0;
uint16_t iChanQ = 0;

iChanI = ((data[0] <<8) + data[1]);
iChanQ = ((data[4] <<8) + data[5]);

[sView Update: iChanI : iChanQ];
[sView setNeedsDisplay];

}

我不确定 unit8_t 是否是传入数据的正确格式。

目前从图表输出的值比我预期的要大得多。

感谢任何帮助。

【问题讨论】:

  • 到目前为止这看起来不错。 uint8_t 是这种操作的合理类型,您不应该对有符号数字和这种方式的位移感到任何意外。你确定“[sView 更新:iChanI : iChanQ];”是正确的(我的 Objective-C 有点生疏,但我不记得有两个未命名参数的调用)
  • sView 更新正在输出一个两通道图。我是否正确移动数据,应该是 8 还是 12?
  • “字节长 12 位”?那不是一个字节,是吗? [我故意忽略了 C 标准定义,即“一个 char 是一个字节,而 char 可以是任何大小”,因为我严重怀疑这段代码是否在使用 12、24 或 36 位字的机器上运行每个字符 12 位]
  • “字节长 12 位”是什么意思?您的意思是 10 字节数组总共由 120 位组成吗?如果是这样,我对此表示怀疑,那么 uint8_t 在这里是相当不合适的。
  • 对不起 iChanI 和 iChanQ 是 12 位的。

标签: c++ objective-c bytearray


【解决方案1】:

您可能有错误的字节序(哪个字节最重要)。所以试试

iChanI = ((data[1] <<8) + data[0]);

和/或
您在 iChanI 的 4 MSBits 中有意外数据。将这些位归零:

iChanI &= 0x0FFF;

一起

iChanI = ((data[1] <<8) + data[0]) & 0x0FFF;

iChanQ 执行相同操作。


您可以改为创建一个类型

typedef struct {
  uint16_t iChanI;
  uint16_t spare1;
  uint16_t iChanQ;
  uint16_t spare3;
  uint16_t spare4;
  } PhonePAcket_t;  // Ten byte packet

(void)receivedData:(uint8_t *)data length:(NSUInteger)len {
  const PhonePAcket_t *pp = (const PhonePAcket_t*) data;
  uint16_t iChanI = pp->iChanI & 0x0FFF;
  uint16_t iChanQ = pp->iChanQ & 0x0FFF;

 [sView Update: iChanI : iChanQ];
 [sView setNeedsDisplay];
}

我避免使用位数组,但可以使用它们。
可能需要包装属性。我对你的具体情况不够熟悉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 2014-04-15
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    相关资源
    最近更新 更多