将Ada代码转换为C#

时间:2014-10-19 15:41:55

标签: c# translation ada checksum

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

由于

2 个答案:

答案 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#编译器。

valueint,已签名,因此右移将符号位扩展到空出的空间;所以在(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