我想用C API把数据从Labview的现场可编程门阵列发送到C函数。要使发送的数据同步,请执行以下操作:
1)输入:
3x I16值
1x U16值
2)在两个步骤中,我使用Labview中的join number函数将这4个值打包到U64中(它执行hi.lo)。所以基本上是:

((I16.I16).(I16.U16))
(   U32   .   U32   )
         U64

3)现在这个U64值被传输到C函数,在这里应该像这样解包:
         U64
(   U32   .   U32   )
((I16.I16).(I16.U16))

现在我想知道如何在C中处理解包。Labview中有类似“Split Number”的函数吗?如何确保所有部件都分配了正确的数据类型?

最佳答案

不,没有。您通常使用按位操作来执行这类操作,主要是移位和掩码:

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;

当然,这假设endianness在任何地方都是正确的,并将first设置为0xfeed(十进制为275),以此类推。
一般来说,每次提取所需的实际代码量是最小的,这可能解释了为什么没有通用函数来执行此操作:您不需要一个。
你当然可以写一个,如果你喜欢的话:
uint16_t extractU16(uint64_t bits, uint8_t lsbIndex)
{
  return (uint16_t) ((bits >> lsbIndex) & 0xffff);
}

鉴于此,您可以将上述内容重写为:
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);

我们可以进一步改进(?)当然,通过执行一个返回extractS16()int16_t,来允许删除这个cast,但我不会费心。:)

关于c - 在C中将数字拆分为高词和低词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26736038/

10-11 23:09