将Ada代码转换为C#
本文关键字:转换 代码 Ada | 更新日期: 2023-09-27 18:27:14
所以我需要帮助转换这个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的人都可以提供一些输入,这将非常有帮助。
感谢
问题似乎与C#有关,也许与您对ADA代码的解释无关。如果你真的像你的帖子所暗示的那样旋转一个16位无符号数字,那么你需要屏蔽结果整数值的上2个字节,这样它们就不会对答案产生影响。在C#中,将uint x投射到ushort将相当于x&0x0000FFFF
public static ushort RotateLeft(ushort value, int count)
{
int left = value << count;
int right = value >> (16 - count);
return (ushort)(left | right);
}
这个答案是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