【发布时间】:2018-10-12 19:10:57
【问题描述】:
我的以下程序具有一个函数,该函数将从一帧 8 字节数据中提取特定字节,并将根据起始位和位长度(从起始位计算的长度)给出所需的相应值。
如何将十六进制的 8 字节数据传递给 main 函数中的指针 *data。
例如,这是我的十六进制“05 00 00 00 00 03 E8 00”的帧数据。这是我的程序。如果有人帮我解决这个问题,我会很高兴。我应该获取一个数组并将数据作为0x05 0x00 0x00 0x00 0x00 0x03 0xE8 0x00 传递到数组中,然后将数组的分配地址分配给指针变量吗?或者只取一个包含0x050000000003E800 的变量并将这个地址分配给指针。两者是否相同?提前致谢。
union u_t
{
uint16_t u16;
uint8_t u8[2];
};
uint16_t Frame2Data(uint8_t *data,uint8_t startBit,uint16_t length)
{
uint16_t mask;
uint8_t start;
uint8_t firstByte,offset;
uint8_t numShift;
union u_t ut;
/*if(length == 8) //preliminary, has to be fixed by correct function.
mask = 0xff;*/
if(length == 7)
mask = 0x7F;
if(length == 10)
mask = 0x3ff;
if(length == 12)
mask = 0xfff;
firstByte = startBit / 8;
offset = (firstByte+2) * 8;
start = startBit + length;
numShift = offset - start;
ut.u8[1] = data[firstByte];
ut.u8[0] = data[firstByte+1];
return (ut.u16 >> numShift) & mask;
}
int main()
{
??????????
uint8_t sB = 46;
uint16_t l = 7;
uint16_t extractValue = Frame2Data(?,sB,l);
return 0;
}
【问题讨论】:
-
有点不清楚你想要什么,没有“hex data”这样的东西。十六进制只是一种写入数据的方式。由于endianness,一次保存多个字节的变量(例如
unsigned long long)不一定与字节数组相同。要获得正确答案,请edit您的问题并创建minimal reproducible example。 -
@user8540390 使用 C99 代码可以使用 复合文字:
Frame2Data((uint8_t [8]){ 5, 0, 0, 0, 0, 3, 0xE8, 0},sB,l);但最好取决于 1)如何创建数据,以及 2)在 @ 之后使用它987654329@.