我想用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/