我正在尝试将这些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);
}
谢谢。
答案 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
缓冲区