You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 09:09:20