codetowns Ответов: 1

Добавить число в массив байтов?


Это звучит так легко сделать, но я (вероятно, глупо) не могу тренироваться, как это сделать. VB.net.

У меня есть байтовый массив из 32 байт, и все, что я хочу сделать, это добавить к нему байт.

напр..

010.......011101011000001

плюс 00000001 становится

010.......011101011000010

Что я уже пробовал:

Сначала я думал, что могу просто добавить к последнему байту в массиве, но иногда его нужно будет перенести в следующий байт.

Я также попытался преобразовать его в целое число, но 32 байта часто могут превышать самые большие целочисленные пределы.

Afzaal Ahmad Zeeshan

Ну и что? В чем же вопрос?

001 + 001 = 010 в двоичном формате, где 1 переносится на следующее сложение и так далее. Подумайте о том, чтобы немного почитать о двоичной системе счисления и арифметике для нее.

codetowns

Да, но что происходит, когда к 11111111 добавляется 1? Затем нужно будет добавить следующий байт.

Является ли единственным решением итерация каждого байта до тех пор, пока не будет никакого вклада от последнего?

Richard MacCutchan

Создайте новый массив на один байт больше и скопируйте старый в новый.

1 Ответов

Рейтинг:
4

OriginalGriff

Я предполагаю, что вы пишете "двоичный" тип данных какой-то формы: если это так, то самое простое решение-обрабатывать его в цикле и делать математику самостоятельно:

byte[] inp = new byte[32] { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1 };
byte b = 1;
for (int i = 31; i >= 0; i--)
    {
    b += inp[i];
    inp[i] = (byte)(b % 2);
    b = (byte)(b / 2);
    }



Цитата:
Извините, что точки должны были показывать общую ширину до 8*32=256 бит. Я недостаточно хорошо объяснился.


Ах... детали очень важны!
Это делает его проще:
byte[] inp = new byte[32] { ... };
int carry  = 1;   // Value to add on.
for (int i = 31; i >= 0; i--)
    {
    carry += inp[i];
    inp[i] = (byte)carry;
    carry >>= 8;
    }


codetowns

Спасибо. Мой C# беден, но я думаю, что понимаю эту идею - я должен зациклить ее и добавить вручную.

OriginalGriff

Да, но есть ли веская причина, по которой вы это делаете? Это немного нелепый способ сделать двоичный файл самостоятельно! :смеяться:

codetowns

Кудахчущий прав! Он вращается вокруг того факта, что у меня есть 32-байтовый массив, к которому я должен добавить байт. Я удивлен, что .NET не позволяет мне сделать это в одной строке!

OriginalGriff

Да, но почему у вас есть 32 байта для хранения 32 бит? Почему бы не хранить их в виде целого числа (32 бита) и не вырезать среднего человека?

Вот почему.Сеть ничего не делает для вас здесь - это странный (и очень неэффективный) способ хранения информации.

codetowns

Нет, это 32 байта с 8 битами в каждом байте.

OriginalGriff

Тогда то, что вы описываете, неверно: добавление байта, содержащего единицу, к массиву байтов, содержащих 010...... 011101011000001, не дает вам массива байтов, содержащего 010.......011101011000010 - он дает вам массив байтов, содержащий 010.......011101011000002

codetowns

Извините, что точки должны были показывать общую ширину до 8*32=256 бит. Я недостаточно хорошо объяснился.

OriginalGriff

Ответ обновлен.