C# 将int型转化为byte/byte[]数组及转16进制数问题

对于一个0~255之间的无符号整数:

int num = 255;
byte b = Convert.ToByte(num);

注:Convert.ToByte()方法能够把许多数值类型、bool、char转成byte,甚至可以把任意进制的合法数字的字符串基于相应的进制转成byte【比如Convert.ToByte("3C",16)可以基于16进制把"3C"转为60】,但是其值范围必须在0~255之间,即一个字节内。

对于一个-128~127的有符号整数:

int num = 127;
sbyte sb = Convert.ToSByte(a);

对于一个内容为数字的字符串,下面的方法会每个数字都当作字符转化,一个字符占一个字节:

string num = "728";
byte[] b = Encoding.UTF8.GetBytes("728");
//b[0]=55 b[1]=50 b[2]=56

引申:转十六进制数问题

我们已经知道一个16进制数占4个比特,1个字节是8个比特,所以1个字节可存储两个16进制数。有时候我们需要把int型整数转成16进制,并放入byte[]数组当中,这时候有以下两种方法:

我们以728为例,它的16进制为2d8

方法一:先转成16进制字符串,如果长度为奇数在最前面补一个0。预先准备一个byte[]字节数组,长度为字符串的一半(1个字节=两个16进制数=两个字符)或者长度为4(int占4个字节),对该字符串逐两个字符进行切割,并调用上面提到的Convert.ToByte()方法转成16进制,放入数组的字节元素当中。方法实现如下:

public static byte[] strToHexByte(string hexString) {
            if ((hexString.Length % 2) != 0){
                hexString = hexString.Insert(0, 0.ToString()); //如果长度为奇,在开头补零
            }
            byte[] returnBytes = new byte[hexString.Length / 2];//byte[]数组
            for (int i = 0; i < returnBytes.Length; i++){
                returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);//每两个字符转byte,放入数组元素中。
            }
            return returnBytes;
        }

对于728,返回的数组是 rb[0]=2  rb[1]=216   (216就是d8的十进制)

方法二:使用BitConverter.GetBytes()方法

byte[] b = BitConverter.GetBytes(728);

因为给的数字是int型,所以数组的长度固定是4个字节了。此时b的值是b[0]=216 b[1]=2 b[2]=0 b[3]=0  这里我们发现这个方法转换后结果的顺序是从索引大到索引小(大小端的问题……),只要颠倒一下数组元素的顺序就可以了。

PS:BitConverter类也提供了反过来从byte[]转int的方法BitConverter.ToInt32(),同样要注意大小端顺序的问题,这里就不再赘述了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章