Равносильная конвертация 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))
- {
- }
- }
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д