如何通过循环修改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
相关产品推荐
相关产品推荐

