Как разобрать двоичную строку в двоичный литерал в C # - PullRequest
0 голосов
/ 15 мая 2018

Вот моя конкретная проблема.Мне нужно представить целое число (например, 1,2,3, ..) в виде двоичного литерала с 128 битами.

Это моя строка, представляющая 1 в двоичном виде: строка = "000 ... 0001";// 128 символов.все нули до последнего 1

Предполагаемый результат: bx000 ... 0001;

Эта проблема состоит в том, что 128 бит больше, чем обычные типы, такие как int, double, decimal и т. д. Таким образом, яПолагаете, что вы должны использовать класс BigInteger для хранения этого двоичного значения ??

Другой способ кадрировать это: Как я могу убедиться, что мое значение BigInteger составляет 16 байтов?

BigInteger val = new BigInteger(1);// но должно быть ровно 16 байт.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Используя метод расширения ToBinaryString из этого ответа , модифицированный так, чтобы пропускать начальные нули и не вводить нулевой знак, вы можете просто использовать PadLeft, чтобы убедиться, что у вас есть начальные нули:

public static string ToBinaryString(this BigInteger bigint) {
    var bytes = bigint.ToByteArray();

    // Create a StringBuilder having appropriate capacity.
    var base2 = new StringBuilder(bytes.Length * 8);

    // Convert remaining bytes adding leading zeros.
    var idx = bytes.Length - 1;
    for (; idx > 0 && bytes[idx] == 0; --idx)
        ;
    for (; idx >= 0; --idx)
        base2.Append(Convert.ToString(bytes[idx], 2).PadLeft(8, '0'));

    return base2.ToString();
}

Затем с префиксом и левым отступом:

var ans = "bx"+val.ToBinaryString().PadLeft(128, '0');
0 голосов
/ 16 мая 2018

Вы должны будете указать количество байтов и заполнить все, что отсутствует с 0, тогда вы можете использовать BitArray для получения значений битов.Примерно так.

public static string GetBitString(BigInteger val, int bytes)
{
    byte[] arrayBytes = new byte[bytes];
    var valBytes = val.ToByteArray();
    for (var i = 0; i < valBytes.Length; i++)
    {
        arrayBytes[i] = valBytes[i];
    }
    var arr = new BitArray(arrayBytes);
    return $"bx{string.Join("", arr.Cast<bool>().Reverse().Select(c => c ? "1" : "0"))}";
}

Другой вариант - просто изменить размер созданного массива до 16 байт.Как то так

public static string GetBitString(BigInteger val, int bytes)
{
    var valBytes = val.ToByteArray();
    Array.Resize(ref valBytes, bytes);
    return $"bx{string.Join("", new BitArray(valBytes).Cast<bool>().Reverse().Select(c => c ? "1" : "0"))}";
}
...