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

如何通过循环修改C#的byte[]数组:删除指定十六进制值字节

解决方案

C#原生数组是固定长度的,没法直接在原数组上批量删除元素——你之前单独调用RemoveRange能删第一个,但循环时数组长度会变化,索引会错位,导致后续找不到目标字节或者触发越界错误。

不用List、不转string的话,最稳妥的方式是先统计需要保留的字节数,再生成新数组存放结果:

场景1:删除所有单独的0x0D(CR)和0x0A(LF)

不管是不是成对出现,只要是这两个字节就删掉:

byte[] byteLine = File.ReadAllBytes(filePath);
// 第一步:统计要保留的字节数(排除0x0D和0x0A)
int keepCount = 0;
foreach (byte b in byteLine)
{
    if (b != 0x0D && b != 0x0A)
    {
        keepCount++;
    }
}

// 第二步:创建新数组,复制符合条件的字节
byte[] result = new byte[keepCount];
int index = 0;
foreach (byte b in byteLine)
{
    if (b != 0x0D && b != 0x0A)
    {
        result[index++] = b;
    }
}

// result就是删除了所有换行相关字节后的数组

场景2:只删除成对的0x0D+0x0A(CRLF)

单独的CR或LF保留,只删连续的两个字节组合:

byte[] byteLine = File.ReadAllBytes(filePath);
int keepCount = 0;
int i = 0;

// 先统计保留的字节数
while (i < byteLine.Length)
{
    // 检查当前和下一个字节是否是CRLF组合
    if (i < byteLine.Length - 1 && byteLine[i] == 0x0D && byteLine[i+1] == 0x0A)
    {
        // 跳过这两个字节
        i += 2;
    }
    else
    {
        keepCount++;
        i++;
    }
}

// 生成结果数组
byte[] result = new byte[keepCount];
int index = 0;
i = 0;
while (i < byteLine.Length)
{
    if (i < byteLine.Length - 1 && byteLine[i] == 0x0D && byteLine[i+1] == 0x0A)
    {
        i += 2;
    }
    else
    {
        result[index++] = byteLine[i++];
    }
}

关于你之前循环失效的原因

用for/foreach正向循环调用删除方法时,每次删除元素后数组长度减少,后续元素会往前移位,原索引对应的内容已经变了——比如第一次删了索引n的元素,下一次循环再找n的位置,会跳过原本的下一个目标。就算用倒序循环(从后往前删)能实现,数组每次修改都会重新分配内存,效率远不如上面一次性统计生成新数组的方式。

内容的提问来源于stack exchange,提问作者maykuul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:02:37