【问题标题】:calculate hexadecimal offset within array计算数组内的十六进制偏移量
【发布时间】:2017-12-06 11:57:16
【问题描述】:

我一般都知道什么是偏移量,但我对以下数组的偏移量有疑问。假设我有一个 uint8 数组:

   const myArray uint8[]=
   {
   0xCB, 0xF8, 0xFA, 0xFB, 0xCA, 0xAC, 0x24, 0x53, 0x64, 0x4F, 0x1E, 0xA2, 
   0xF9, 0x78, 0xCA, 0x63, 0xB8, 0x7F, 0xFC, 0xFB, 0xD8, 0xFA, 0xFB, 0x8F, 
   0x67, 0xC1, 0xFD, 0xF8, 0xC2, 0xF8, 0xFF, 0xF9, 0xFA, 0xE4, 0xFA, 0xF9,
   0xFB, 0xFE, 0xE4, 0xFA, 0xCA, 0xCF, 0x94, 0xD5, 0xD6, 0xCA, 0xA2, 0xA2,
   ....
   ....
   ....
   ....
}

现在我有描述:

--------------------------------------------------
| Offset in myArray | meaning     |  size (Byte) |
--------------------------------------------------
|    0x00           |  Version     |  1          |
-------------------------------------------------
|    0x01           |  Timestamp  |  15         |
 ------------------------------------------------
|    0x10           |  Info1      |   8         |
 ------------------------------------------------
|    0x18           |  Info2      |   2         |
 ------------------------------------------------

这在 myArray 中是否意味着:

对于偏移量0x00:是myArray的索引为0的元素,所以是0xCB

对于偏移量 0x01:它是索引为 1..9 的元素,所以 0xF8、0xFA、0xFB、0xCA、0xAC、0x24、0x53、0x64、0x4F

等等

还是我解释错了?

【问题讨论】:

  • 没错..
  • 我不明白你是怎么想出1..9 字段Timestamp 的;它的大小指定为 15,因此相关元素应为 15 而不是 9,即0xF8, 0xFA, 0xFB, 0xCA, 0xAC, 0x24, 0x53, 0x64, 0x4F, 0x1E, 0xA2, 0xF9, 0x78, 0xCA, 0x63
  • 差不多,但是你忘记了 size。并且偏移量以 十六进制 表示。这意味着“Info1”字段开始myArray[16](即myArray[0x10])。
  • 几乎正确。第二个字段长 15 个字节,从 0x01 .. 0x0F 开始,而不是 0x09
  • 不正确,因为对于偏移量 0x01,它是从 0x01 到 0x10 以十六进制表示的元素(大小为 15,十六进制 0xF),因此元素 0xF8、0xFA...、0xCA、0x63。

标签: c arrays hex offset


【解决方案1】:

您的元素具有给定的大小,如您的大小列所述。所以基本上这告诉你的是:

版本从偏移量0x00(又名位置0)开始,大小为1,所以它的第一个元素:0xCB

时间戳从偏移量 0x01(又名位置 1)开始,大小为 15,因此它的组合元素为:[0xF8, 0xFA, 0xFB , 0xCA, 0xAC, 0x24, 0x53, 0x64, 0x4F, 0x1E, 0xA2, 0xF9, 0x78, 0xCA, 0x63]

Info1 从偏移量 0x10(又名位置 16)开始,大小为 8,因此它的组合元素为:[0xB8, 0x7F, 0xFC , 0xFB, 0xD8, 0xFA, 0xFB, 0x8F]

Info2 从偏移量 0x18(也称为位置 24)开始,大小为 2,因此它的组合元素:[0x67, 0xC1]

就这样……

正如其他人指出的那样,您在分析中似乎出错的一件事是偏移量以 16 为底(十六进制)。所以 0x10 是 1 * 16 + 0 = 16。

如何将每个字节序列解释为正确的类型取决于您。

这有意义吗?

【讨论】:

    猜你喜欢
    • 2018-08-27
    • 2012-03-04
    • 1970-01-01
    • 2020-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    相关资源
    最近更新 更多