C#int到byte

我需要将int转换为byte[] ,这样做的一个方法就是使用BitConverter.GetBytes() 。 但我不确定如果符合以下规范:

一个XDR有符号整数是一个32位数据,编码范围[-2147483648,2147483647]中的一个整数。 整数用二的补码表示。 最重要和最不重要的字节分别是0和3。 整数被声明如下:

来源: RFC1014 3.2

我怎么能做一个int字节转换,将满足上述规格?

RFC只是试图说一个有符号的整数是一个正常的4字节的整数,字节以big-endian方式sorting。

现在,你很可能在一个小端机器上工作, BitConverter.GetBytes()会给你反转的byte[] 。 所以你可以尝试:

 int intValue; byte[] intBytes = BitConverter.GetBytes(intValue); Array.Reverse(intBytes); byte[] result = intBytes; 

然而,为了使代码变得最便携,你可以这样做:

 int intValue; byte[] intBytes = BitConverter.GetBytes(intValue); if (BitConverter.IsLittleEndian) Array.Reverse(intBytes); byte[] result = intBytes; 

这里有另外一个方法:我们都知道1x字节= 8x位,而且“常规”整数(int32)包含32位(4字节)。 我们可以使用>>操作符将位右移(>>操作符不会改变值)。

 int intValue = 566; byte[] bytes = new byte[4]; bytes[0] = (byte)(intValue >> 24); bytes[1] = (byte)(intValue >> 16); bytes[2] = (byte)(intValue >> 8); bytes[3] = (byte)intValue; Console.WriteLine("{0} breaks down to : {1} {2} {3} {4}", intValue, bytes[0], bytes[1], bytes[2], bytes[3]); 

BitConverter.GetBytes(int)几乎做你想要的,除了字节序是错误的。

在使用BitConverter.GetBytes或使用Jon Skeet的EndianBitConverter类之前,可以使用IPAddress.HostToNetwork方法交换整数值内的字节。 这两种方法在可移植性方面做了正确的事情(tm)。

 int value; byte[] bytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(value)); 

当我看这个描述的时候,我有一种感觉,这个xdr整数只是一个大端的“标准”整数,但它是以最混乱的方式expression的。 两个补码符号更好地被称为U2,这就是我们今天使用的处理器。 字节顺序表示这是一个大端符号。
所以,回答你的问题,你应该在你的数组中反转元素(0 – 3,1 – 2),因为它们是用little-endian编码的。 只要确认,你应该首先检查BitConverter.IsLittleEndian ,看看你正在运行的机器。

如果你想了解更多关于表示数字的各种方法的一般信息,包括Two's Complement,请看:

维基百科上的二进制补码和签名数字表示