Запрос двоичных, Int32 и шестнадцатеричных преобразований

Следующий код находится в стадии разработки, и я также трачу время, чтобы попытаться узнать больше о преобразовании между битами, шестнадцатеричными и целыми числами; Многое из этого, очевидно, является повторяющимися операциями, поскольку мы делаем одно и то же с 7 различными «пакетами», поэтому не стесняйтесь замалчивать повторы (просто хотелось иметь всю структуру кода, чтобы, возможно, ответить на некоторые вопросы заранее).

/*  Pack bits into containers to send them as 32-bit (4 bytes) items */
            int finalBitPackage_1 = 0;
            int finalBitPackage_2 = 0;
            int finalBitPackage_3 = 0;
            int finalBitPackage_4 = 0;
            int finalBitPackage_5 = 0;
            int finalBitPackage_6 = 0;
            int finalBitPackage_7 = 0;

            var bitContainer_1 = new BitArray(32, false);
            var bitContainer_2 = new BitArray(32, false);
            var bitContainer_3 = new BitArray(32, false);
            var bitContainer_4 = new BitArray(32, false);
            var bitContainer_5 = new BitArray(32, false);
            var bitContainer_6 = new BitArray(32, false);
            var bitContainer_7 = new BitArray(32, false);

            string hexValue = String.Empty;

            ...

           *assign 32 bits (from bools) to every bitContainer[] here*

            ...

/*  Using this single 1-D array for all assignments works because as soon as we convert arrays, 
                                        we store the result; this way we never overwrite ourselves    */
            int[] data = new int[1];

            /*  Copy containers to a 1-dimensional array, then into an Int for transmission  */
            bitContainer_1.CopyTo(data, 0);
            hexValue = data[0].ToString("X");
            finalBitPackage_1 = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

            bitContainer_2.CopyTo(data, 0);
            hexValue = data[0].ToString("X");
            finalBitPackage_2 = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

            bitContainer_3.CopyTo(data, 0);
            hexValue = data[0].ToString("X");
            finalBitPackage_3 = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

            bitContainer_4.CopyTo(data, 0);
            hexValue = data[0].ToString("X");
            finalBitPackage_4 = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

            bitContainer_5.CopyTo(data, 0);
            hexValue = data[0].ToString("X");
            finalBitPackage_5 = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

            bitContainer_6.CopyTo(data, 0);
            hexValue = data[0].ToString("X");
            finalBitPackage_6 = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

            bitContainer_7.CopyTo(data, 0);
            hexValue = data[0].ToString("X");
            finalBitPackage_7 = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

Из того, что я узнал до сих пор, если двоичное значение преобразуется в Int32, первая цифра говорит, будет ли оно -/+, где 1 указывает (-), а 0 указывает (+); однако в моих битовых массивах, начинающихся с 0, они отображаются как отрицательное число, когда я выполняю транзакцию CopyTo(int[]), а битовые массивы, начинающиеся с 1, отображаются как положительные при копировании.

Кроме того, существует проблема преобразования их значений Int32 в значения Hex. Любые значения, которые получаются в результате преобразования массива как отрицательные, не получают 8 F, добавленных вперед, как при проверке с помощью http://www.binaryhexconverter.com/, поэтому я не был уверен в этом, поскольку мои знания Hex ограничены, и я не хотел терять значимые данные при передаче данных в другую систему (через TCP /IP, если это кому-то важно). Я опубликую значения, которые я получаю из всего ниже, чтобы помочь прояснить это.


Variable                    Binary                     Int32[]       My Hex
bitContainer_1  "01010101010101010101010101010101"  "-1431655766"   AAAAAAAA
bitContainer_2  "10101010101010101010101010101010"  "1431655765"    55555555
bitContainer_3  "00110011001100110011001100110011"  "-858993460"    CCCCCCCC
bitContainer_4  "11001100110011001100110011001100"  "858993459"     33333333
bitContainer_5  "11100011100011100011100011100011"  "-954437177"    C71C71C7
bitContainer_6  "00011100011100011100011100011100"  "954437176"     38E38E38
bitContainer_7  "11110000111100001111000011110000"  "252645135"     F0F0F0F

Шестнадцатеричные значения онлайн:

FFFFFFFFAAAAAAAA
555555555
FFFFFFFFCCCCCCCC
33333333
FFFFFFFFC71C71C7
38E38E38
F0F0F0F

person Alex Watts    schedule 14.03.2016    source источник
comment
Биты в BitArray находятся в обратном порядке. Например, -1431655766 в двоичном формате равно 10101010101010101010101010101010.   -  person Dennis_E    schedule 14.03.2016
comment
Одной из моих первых мыслей, когда я писал этот пост, было то, что битмассив читается [31]->[30]->[29]->и т. д., поскольку он копируется и потому что он был построен [0]->[1]- ›[2]-›и т. д. с помощью одиночного ручного назначения, это вызывало его интерпретацию в обратном направлении (двоичный формат, размещенный в OP, - это то, что bitArray читает как во время точек останова, когда я пошагово просматриваю каждую переменную за раз). Итак, вы думаете, может быть, изменить bitContainer_X.CopyTo() на что-то вроде bitContainer_X.CopyTo().Reverse()?   -  person Alex Watts    schedule 14.03.2016
comment
К вашему сведению: все они Int32. Их база отличается, но их тип одинаков.   -  person Dennis_E    schedule 14.03.2016
comment
Буквы F появляются впереди, потому что сайт использует 64-битные числа, а вы используете 32-битные числа. Вы можете увидеть разницу с: Convert.ToString(-1431655766, 16) и Convert.ToString(-1431655766L, 16)   -  person Dennis_E    schedule 14.03.2016
comment
Вы не делаете никаких преобразований. Вы упаковываете байты в числа.   -  person jdweng    schedule 14.03.2016
comment
@Dennis_E Я совсем забыл, что Hex основан на 64! Но, возможно, это открывает для меня возможность упаковывать элементы в еще меньшее количество контейнеров, используя Int64 вместо Int32!!!   -  person Alex Watts    schedule 14.03.2016
comment
@jdweng Думаю, ты прав. У меня просто сложилось впечатление, что если массив int увидит список из 1 и 0, он будет неявно обрабатывать двоичный файл для int   -  person Alex Watts    schedule 14.03.2016
comment
Нет никакой разницы в том, как C# хранит целые и двоичные числа. Преобразование в целые числа выполняется в операторах ввода и вывода (чтение и запись). Вы должны неявно указать, является ли число одним, двумя, четырьмя или 8 байтами.   -  person jdweng    schedule 15.03.2016


Ответы (1)


Если каждое значение целочисленного знака перевернуто, поместите -1 * theIntegerValue, чтобы отменить его. Это также может иметь какое-то отношение к тому, когда вы вызываете toStirng("X"), возможно, используете пустую строку?

person Bobby C. Robillard    schedule 14.03.2016
comment
Итак, попробуйте просто вызвать .ToString() без параметров, как вы думаете? Я также упомяну, что я совершенно уверен, что делал это до того, как у меня был добавлен метод .ToString() в более ранней версии, где я просто перешел в двоичном виде к Int32, но не в Hex впоследствии - person Alex Watts; 14.03.2016
comment
Это стоит попробовать, потому что вы конвертируете данные в строку, X, который также преобразуется, может сместить код, который вы хотите преобразовать в Hex/Int32. Если он делал это раньше, то я действительно не уверен, это просто мое лучшее предположение о простом решении, дайте мне знать, что происходит. - person Bobby C. Robillard; 14.03.2016
comment
Честно говоря, я даже не был уверен, как ToString(X) преобразуется в шестнадцатеричный, кроме того, что в других сообщениях StackOverFlow говорилось об использовании, ха-ха. Тогда я посмотрю, как это работает, спасибо! - person Alex Watts; 14.03.2016