C#中byte[]数组定义与buffer[i/2]索引写法含义咨询
C# 代码片段疑问解答
以下是你提供的存在笔误的原始代码,修正重复声明的问题后可正常运行,核心功能是把十六进制格式的字符串转为字节数组:
public static void Main() { String s = "a55a0019833400e280699400005002f172ad27fd8401120d0a"; // 移除字符串里所有空格 s = s.Replace(" ", ""); // 初始化字节数组 byte[] buffer = new byte[s.Length / 2]; // 每次跳2个字符遍历字符串 for (int i = 0; i < s.Length; i += 2) { // 把2个十六进制字符转成字节,存入数组对应位置 buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16); } }
注:原提问片段重复写了一次
byte[] buffer = new byte[s.Length / 2];,属于复制笔误,同一个代码块里重复声明同名变量会直接编译报错。
疑问1:byte[] buffer是否为数组类型?
是。
C# 里在类型后面加[]就是声明对应类型的一维数组,byte[] buffer即声明了一个用来存byte类型(无符号字节,取值范围0~255)数据的数组变量。
后面的new byte[s.Length / 2]是完成数组的初始化,指定这个数组最多能存s.Length / 2个字节。之所以长度取字符串长度的一半,是因为十六进制的编码规则就是2个字符对应1个字节,比如字符串"a5"转成字节就是1个值,所以最终数组长度刚好是原字符串长度的一半。
疑问2:buffer[i / 2]的含义和作用
这是C#访问数组元素的固定写法,格式为数组名[索引值],用来定位数组里指定位置的元素,做读写操作。要注意C#数组的索引是从0开始数的:第一个位置的索引是0,第二个是1,最后一个位置的索引是数组总长度减1。
这里的i / 2就是用来算当前转出来的字节要放到数组的哪个位置,完全是配合循环逻辑写的:
- 循环变量
i从0开始,每次加2,取值依次是0、2、4、6……直到走完整个字符串 - 每次循环都会截取下标
i开始的2个字符,转成1个字节 - 用
i除以2刚好能得到连续的从0开始递增的索引:- i=0时,截前2个字符转字节,要放到数组第一个位置(索引0),0/2=0,刚好对应
- i=2时,截第3、4个字符转字节,要放到数组第二个位置(索引1),2/2=1,刚好对应
- i=4时对应索引2,以此类推
这种写法可以保证转出来的字节按顺序挨个存入数组,不会错位,也不会超出数组的长度范围报错。
内容的提问来源于stack exchange,提问作者Ruslan Gaifutdinov
相关产品推荐
相关产品推荐

