将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的人都可以提供一些输入,这将非常有帮助。

感谢

将Ada代码转换为C#

问题似乎与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