将数字拆分为C中的高位和低位

eri*_*rik 0 c labview

我想使用C API将Labview FPGA中的数据发送到C函数.为了使数据传输同步,我执行以下操作:

1)输入:

  • 3x I16值
  • 1x U16值

2)在两个步骤中,我使用Labview中的连接数函数将这4个值打包到U64中(它确实是hi.lo).所以它基本上是:

((I16.I16).(I16.U16))
(   U32   .   U32   )
         U64
Run Code Online (Sandbox Code Playgroud)

3)现在这个U64值被转移到C函数,它应该被解压缩,如下所示:

         U64
(   U32   .   U32   )
((I16.I16).(I16.U16))
Run Code Online (Sandbox Code Playgroud)

现在我想知道如何在C中处理拆包.在Labview中是否有类似"拆分号"功能的东西?如何确保所有部件都分配了正确的数据类型?

unw*_*ind 5

不,没有.你通常使用按位运算来做这种事情,主要是移位和掩码:

const uint64_t incoming = 0xfeedcafebabef00d;
const int16_t  first  = (int16_t) (incoming >> 48);
const int16_t  second = (int16_t) ((incoming >> 32) & 0xffff);
const int16_t  third  = (int16_t) ((incoming >> 16) & 0xffff);
const uint16_t fourth = incoming & 0xffff;
Run Code Online (Sandbox Code Playgroud)

这当然假定端点在任何地方都是正确的,并且将设置first0xfeed(-275十进制),依此类推.

作为一般观察,每次提取所需的实际代码量是最小的,这可以解释为什么没有通用功能来执行此操作:您不需要一个.

如果您愿意,您当然可以写一个:

uint16_t extractU16(uint64_t bits, uint8_t lsbIndex)
{
  return (uint16_t) ((bits >> lsbIndex) & 0xffff);
}
Run Code Online (Sandbox Code Playgroud)

鉴于此,您可以将上述内容重写为:

const int16_t  first  = (int16_t) extractU16(incoming, 48);
const int16_t  second = (int16_t) extractU16(incoming, 32);
const int16_t  third  = (int16_t) extractU16(incoming, 16);
const uint16_t fourth = extractU16(incoming, 0);
Run Code Online (Sandbox Code Playgroud)

我们可以通过做一个extractS16()返回来进一步改进(?)int16_t,允许放弃演员,但我不会打扰.:)