处理大型数字输入和输出十六进制字符串

时间:2018-06-22 10:54:30

标签: c# visual-studio-2017 biginteger .net-4.7

我需要输入一个大于64位的数字输入,确保仅丢弃其余的83位(如果输入大于83位)并将其转换为十六进制字符串。

我发现我可以使用BigInteger(System.Numerics.BigInteger)接受来自用户的数字输入,但是我不确定如何进行此操作。我在下面概述了我的方法:

BigInteger myBigInteger = BigInteger.Parse("123456789012345678912345");
 byte[] myByte = myBigInteger.ToByteArray();
 if (myByte.Length < 11) // if input is less than 80 bits
 {
    // Convert Endianness to Big Endian 
    // Convert myBigInteger to hex and output
 }
 // Drop the elements greater than 11
 // Convert element 10 to int and & it with 0x7F
 // Replace the element in the array with the masked value
 // Reverse array to obtain Big Endian
 // Convert array into a hex string and output

我不确定要解决的问题是正确的方法。任何意见,将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:1)

作弊! :-)

public static readonly BigInteger mask = new BigInteger(new byte[]
{
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0x07
});

static void Main(string[] args)
{
    BigInteger myBigInteger = BigInteger.Parse("1234567890123456789123450000");
    BigInteger bi2 = myBigInteger & mask;

    string str = bi2.ToString("X");

使用按位&用预先计算的掩码截断数字!然后使用.ToString("X")以十六进制形式编写它。

请注意,如果您恰好需要83位,则它是10个8位加3位的块...最后3位是0x07而不是0x7F!

请注意,您可以:

string str = bi2.ToString("X21");

将数字填充为21位(可以用83位表示的最大十六进制数)