【问题标题】:How to pass hexadecimal data inside the following function如何在以下函数中传递十六进制数据
【发布时间】: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@.

标签: c arrays pointers hex


【解决方案1】:

要将十六进制写入的数据传递给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

【讨论】:

  • 是的,由于长度等于7,所以mask初始化为0x7F
  • 是的,明白了。谢谢
猜你喜欢
  • 1970-01-01
  • 2019-03-02
  • 1970-01-01
  • 2021-04-02
  • 2014-02-18
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
相关资源
最近更新 更多