0

我有这个 Python 代码(hexdigest 是 SHA1):

d = long(hexdigest, 16)
if d >> 159:
    return "-%x" % ((-d) & (2**160-1))
return "%x" % d

我需要将此代码翻译成 D。我尝试了几件事:

  • to!long(hexdigest, 16) – 溢出失败(对于 ulong 来说太大)
  • std.BigInt不支持二进制&

你会如何在 D 中做到这一点?我将此问题标记为C相关,因为 C 解决方案也适用于 D。

4

2 回答 2

1

这段代码看起来像一个 NOP。您正在解析一个 SHA1 hexdigest,它是一个 20 字节的数字。它永远不会超过 160 位,因此d>>160始终为 0。因此,您只需以相同的格式重新格式化十六进制摘要。我猜你正在删除前导零,如果有的话。

我很惊讶 Dstd.BigInt不提供位操作(&, |, ^)。自己写?不可能那么难。

于 2012-07-31T16:28:52.440 回答
0

因此,您需要从无符号到有符号 2 的补码的十六进制到十六进制转换。您是否意识到您可以逐个数字地进行?输入字符串中的每个数字加上输出字符串中的对应数字都等于0xf,除了最后一个,它是0x10。对于这个问题,任何一种 bigint 算术都是多余的。

C 中的演示(注意:这不会去除前导零)

#include <stdio.h>
#include <string.h>

static int fromhex(char dig)
{
  return dig >= '0' && dig <= '9' ? dig - '0'      :
         dig >= 'A' && dig <= 'F' ? dig - 'A' + 10 :
         dig >= 'a' && dig <= 'f' ? dig - 'a' + 10 :
         -1;
}

int main(int argc, char **argv)
{
  if(argc!=2 ||
     strlen(argv[1])!=40 ||
     strspn(argv[1], "0123456789abcdefABCDEF")!=40)
  {
    fprintf(stderr, "Usage: %s sha1hex\n", argv[0]);
    return 1;
  }
  if(strchr("01234567", argv[1][0])) {
    puts(argv[1]);
  } else {
    int i;
    putchar('-');
    for(i=0;i<39;++i)
      printf("%x", 15 - fromhex(argv[1][i]));
    printf("%x\n", 16 - fromhex(argv[1][i]));
  }
  return 0;
}
于 2015-10-13T17:51:22.793 回答