【发布时间】:2016-03-14 17:27:13
【问题描述】:
下面的代码是一个正在进行的工作,我也花时间尝试学习更多关于位、十六进制和整数之间转换的知识; 其中很多显然是重复操作,因为我们对 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 开头的 bitArrays 中,当我执行 CopyTo(int[]) 事务时,它们显示为负数,而以 1 开头的 bitArrays 在复制时显示为正数。
此外,还有将它们从 Int32 值转换为 Hex 值的问题。当http://www.binaryhexconverter.com/ 检查时,从数组转换中得出的任何负值都不会将 8 F 添加到前面,所以我不确定这之间的区别,因为我的十六进制知识有限而且我没有当我将数据传输到另一个系统时(如果对任何人都重要,则通过 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
【问题讨论】:
-
BitArray 中的位是相反的。例如,二进制的-1431655766是10101010101010101010101010101010。
-
当我写这篇文章时,我的第一个想法是 bitArray 正在被读取 [31]->[30]->[29]->等,因为它被复制并且因为它是构建的 [ 0]->[1]->[2]->etc 通过单个手动赋值导致它被向后解释(OP 中发布的二进制格式是 bitArray 在断点期间读取的内容,当我单步执行每个变量时时间)。所以你认为可能将 bitContainer_X.CopyTo() 更改为 bitContainer_X.CopyTo().Reverse() 之类的东西?
-
仅供参考:它们都是 Int32。它们的 base 不同,但它们的 type 相同。
-
F 出现在前面是因为该站点使用 64 位数字,而您使用的是 32 位数字。您可以通过以下方式看到区别:
Convert.ToString(-1431655766, 16)和Convert.ToString(-1431655766L, 16) -
C# 存储整数和二进制的方式没有区别。在输入和输出语句(读取和写入)中执行到整数的转换。您必须隐式指定数字是 1、2、4 还是 8 个字节。