C#中的等效C代码。 (uint8_t *)施放?

时间:2018-01-17 13:02:21

标签: c# c

我正在尝试将这些C代码转换为C#。但是我偶然发现了一些我不明白究竟发生了什么的部分,所以我无法翻译它。

void foo(uint64_t *output, uint64_t *input, uint32_t Length){

    uint64_t st[25];

    memcpy(st, input, Length);

    ((uint8_t *)st)[Length] = 0x01;

    memset(((uint8_t *)st) + Length + 1, 0x00, 128 - Length - 1);

    for(int i = 16; i < 25; ++i) st[i] = 0x00UL;

    // Last bit of padding
    st[16] = 0x8000000000000000UL;

    bar(st);

    memcpy(output, st, 200);
}

更具体地说,在((uint8_t *)st)[Length] = 0x01;部分。我无法理解这一行中的演员/指针。为什么*适合?如果有人能解释发生了什么,我将不胜感激。

到目前为止我在C#中得到了什么:

private void foo(ref ulong[] output, ref ulong[] input, uint Length)
    {
        ulong[] st = new ulong[25];

        //memcpy(st, input, Length);
        Buffer.BlockCopy(input, 0, st, 0, (int)Length);

        // Help in these line please:
        //((uint8_t *)st)[Length] = 0x01;

        // Still don't know what to do here too:
        //memset(((byte)st) + Length + 1, 0x00, 128 - Length - 1);

        for (int i = 16; i < 25; ++i)
        {
            st[i] = 0x00U;
        }

        // Last bit of padding
        st[16] = 0x8000000000000000U;

        bar(st);

        //memcpy(output, st, 200);
        Buffer.BlockCopy(st, 0, output, 0, 200);
    }

谢谢。

1 个答案:

答案 0 :(得分:0)

你的功能是相当原始的记忆操作:

void foo(uint64_t *output, uint64_t *input, uint32_t Length)
{
  uint64_t st[25];

您的函数获取指向uint64_t的16个元素的指针,并准备一个本地缓冲区(st)来存储它们的副本。

  memcpy(st, input, Length);
  ((uint8_t *)st)[Length] = 0x01;
  memset(((uint8_t *)st) + Length + 1, 0x00, 128 - Length - 1);

input数组复制到st,但插入一个值为1的字节,其起始位置为Length个字节的偏移量。

  for(int i = 16; i < 25; ++i) st[i] = 0x00UL;

缓冲区的其余8个元素被清除为0.写st[16]是没有意义的,因为它将在下一行再次更改...

  // Last bit of padding
  st[16] = 0x8000000000000000UL;

现在我们从输入缓冲区有16 * 8个字节,1个额外的字节,值1插入某处,其余的元素用1&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;

  bar(st);

  memcpy(output, st, 200);
}

做一些我们不知道的事情,并将得到的25个元素复制到output缓冲区