因此,您需要从无符号到有符号 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;
}