所以我需要帮助转换这个ada代码int c#,它基本上是一个校验和算法。
ADA:
CHECKSUM_VALUE := ((ROTATE_LEFT_1_BIT(CHECKSUM_VALUE)) xor (CURRENT_VALUE));
这是我能想到的:
C#:
checksum = RotateLeft(checksum, rotateCount, sizeof(ushort) * 8) ^ word;
RotateLeft功能:
public static int RotateLeft(int value, ushort rotateCount, int dataSize)
{
return (value << rotateCount) | (value >> (dataSize - rotateCount));
}
然而,当比较ada和C#算法的校验和结果时,它们不匹配,所以我认为我的转换不正确,任何使用过ada的人都可以提供一些输入,这将非常有帮助。
由于
答案 0 :(得分:2)
问题似乎与C#有关,也许与您对ADA代码的解释不一致。如果你真的正如你的帖子所暗示的那样正在旋转一个16位无符号数,那么你需要屏蔽得到的整数值的高2字节,这样它们就不会对答案做出贡献。在C#中使用uint x转换为ushort将相当于x&amp; 0x0000FFFF
public static ushort RotateLeft(ushort value, int count)
{
int left = value << count;
int right = value >> (16 - count);
return (ushort)(left | right);
}
答案 1 :(得分:1)
这个答案在C中,因为我没有C#编译器。
您value
为int
,已签名,因此右移将符号位扩展到空出的空间;所以在(value << rotateCount) | (value >> (dataSize - rotateCount))
中,右半边((value >> (dataSize - rotateCount))
)需要将顶部位掩盖掉。我不知道你为什么需要dataSize
,不是sizeof(value)
吗?
我认为更好的解决方案是使用unsigned
,以便右移将零点引入空出的空间。
#include <stdio.h>
unsigned rotateLeft(unsigned value, int by) {
const unsigned bits = sizeof(value) * 8;
return (value << by) | (value >> (bits - by));
}
int main() {
unsigned input = 0x52525252;
unsigned result = input;
printf("input: %x\n", input);
{
int j;
for (j = 0; j < 8; j++) {
result = rotateLeft(result, 1);
printf("result: %x\n", result);
}
}
return 0;
}
输出
input: 52525252
result: a4a4a4a4
result: 49494949
result: 92929292
result: 25252525
result: 4a4a4a4a
result: 94949494
result: 29292929
result: 52525252