首页 > 解决方案 > 如何在以下函数中传递十六进制数据

问题描述

我的以下程序具有一个函数,该函数将从 8 字节数据帧中提取特定字节,并将根据起始位和位长度(从起始位计算的长度)给出所需的相应值。

如何将十六进制的 8 字节数据传递给主函数中的指针 *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;
}

标签: carrayspointershex

解决方案


要将十六进制写入的数据传递给data,您可以简单地编写:

uint8_t data [] = { 0x05, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE8, 0x00};

请注意,变量mask未初始化,因为l等于 7,并且所有初始化变量的指令mask都是死代码,如红色所示,使用源代码分析器:

https://taas.trust-in-soft.com/tsnippet/t/6d486c5b


推荐阅读