Равносильная конвертация byte[] -> BigInteger -> byte[] - C#
Формулировка задачи:
Здравствуйте. Пишу проект для дипломной работы по криптографии и в нем необходимо считывать из файла заданное количество байт, преобразовывать их в беззнаковое длинное число, шифровать и потом записывать в другой файл. Затем проводится обратная операция и исходный и полученный в результате этой операции файлы должны совпадать. Проблема в том что при преобразовании byte[] в BigInteger иногда получаются отрицательные числа, и при преобразовании из BigInteger в byte[] получаются не одинаковые массивы байт.
Помогите написать два метода конвертации из byte[] в BigInteger и BigInteger в byte[], так чтобы исходный и результирующий массив совпадали причем BigInteger должен быть всегда положительным.
Мои попытки:
№1:
№2:
Вот так я это тестировал:
P.S. Я задавал этот же вопрос на stackoverflow но там ответа не получил. Очень надеюсь на вашу помощь.
public ExtendedBigInteger(byte[] data) { if (!data.Any()) throw new ArgumentNullException(); if (data.Last() != 0) { IsNegative = true; Array.Resize(ref data, data.Length +1); Value = new BigInteger(data); } } public byte[] ToByteArray() { byte[] data = Value.ToByteArray(); if (IsNegative) { Array.Resize(ref data, data.Length - 1); } return data; }
public UnsignedBigInteger(byte[] data, bool isNormalData) { _initialDataLength = data.Length; if (!data.Any()) throw new ArgumentNullException(); if (data.Last() != 0) { IsNegative = true; Array.Resize(ref data, data.Length + 1); Value = new BigInteger(data); } } public byte[] ToByteArray(bool toNormalData) { byte[] data = Value.ToByteArray(); if (IsNegative) { Array.Resize(ref data, data.Length - 1); } if (_initialDataLength != null) { Array.Resize(ref data, _initialDataLength.Value); } return data; }
using (var stream = new FileStream(myFile, FileMode.Open, FileAccess.Read)) { byte[] buffer = new byte[32]; using (var reader = new BinaryReader(stream)) { for (int i = 0; i < stream.Length; i += bufferSize) { buffer = reader.ReadBytes(32); var bigValue = new ExtendedBigInteger(buffer); //var bigValue = new UnsignedBigInteger(buffer); var data = bigValue.ToByteArray(); if (!buffer.SequenceEqual(data)) { //Breakpoint - error } } } }
Решение задачи: «Равносильная конвертация byte[] -> BigInteger -> byte[]»
textual
Листинг программы
static void Main(string[] args) { var bufferSize = 32; var myFile = @"C:\myFile.jpg"; Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; using (var stream = new FileStream(myFile, FileMode.Open, FileAccess.Read)) { using (var reader = new BinaryReader(stream)) { while (stream.Position < stream.Length) { var buffer = reader.ReadBytes(bufferSize); BigInteger b1 = BigInteger.Parse(string.Join("", buffer.Select(d => d.ToString("d3")).ToArray())); string s1 = b1.ToString("0,0"); byte[] outData = s1.Split(new char[] { ',' }).Select(s => byte.Parse(s)).ToArray(); if(b1.Sign == -1) { } if(!buffer.SequenceEqual(outData)) { } } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д