如何在C#代码中暴力尝试所有十六进制值组合解析DOS游戏图形
DOS游戏图形转灰度BMP代码的循环错误修正与优化
问题描述
原C#代码通过判断input_byte是否等于0xFF、0xFE来执行对应逻辑,现在需要暴力遍历0x00到0xFF的所有十六进制值组合,但添加的for循环逻辑错误导致无限运行,同时需要排除仅含数字的十六进制值(如00、01等)。
原代码片段:
input_byte = input_data[current_input_position]; current_input_position++; if(input_byte == 0xFF) { //============== // Fin de chunk //============== Save(); current_output_index++; RLE_sumador = 0; line_min_length = int.MaxValue; line_max_length = 0; width_current = 0; image_height = 0; } else if(input_byte == 0xFE) { //================= // Siguiente linea //================= if(width_current < line_min_length) line_min_length = width_current; if(width_current > line_max_length) line_max_length = width_current; if(forced_image_width!=null) { count = forced_image_width.Value - width_current; if(count > 0) { for(n=0; n<count; n++) { output_buffer.Add(0); } } } image_height++; width_current = 0; }
错误循环示例:
for (int i = 0x00; i <= 0xFF; input_byte++)
错误分析
- 循环控制逻辑错误:for循环的增量部分应更新循环变量
i,但错误代码中更新的是input_byte,导致i始终停留在0x00,循环条件i <= 0xFF永远成立,触发无限循环。 - 未实现过滤需求:错误循环未处理“排除仅含数字的十六进制值”的要求,这类值对应十进制0-9(即0x00到0x09)。
修正方案
1. 修复循环运行逻辑
将循环增量改为更新控制变量i,同时把input_byte赋值为当前循环的i值,确保完整遍历0x00到0xFF的所有值。
2. 添加过滤逻辑
在循环内部增加判断,跳过0x00到0x09的纯数字十六进制值。
修正后的完整代码示例:
// 遍历0x00到0xFF的所有十六进制值 for (int i = 0x00; i <= 0xFF; i++) { // 排除仅含数字的十六进制值(0x00-0x09) if (i >= 0x00 && i <= 0x09) { continue; } input_byte = (byte)i; // 将循环变量赋值给input_byte // 复用原有的逻辑判断 if(input_byte == 0xFF) { // Fin de chunk逻辑 Save(); current_output_index++; RLE_sumador = 0; line_min_length = int.MaxValue; line_max_length = 0; width_current = 0; image_height = 0; } else if(input_byte == 0xFE) { // Siguiente linea逻辑 if(width_current < line_min_length) line_min_length = width_current; if(width_current > line_max_length) line_max_length = width_current; if(forced_image_width!=null) { count = forced_image_width.Value - width_current; if(count > 0) { for(n=0; n<count; n++) { output_buffer.Add(0); } } } image_height++; width_current = 0; } // 可在此添加其他input_byte值的处理逻辑 }
补充说明
- 仅含数字的十六进制值对应十进制0-9(0x00到0x09),因为0x0A及以上的十六进制值会包含字母,符合过滤要求。
- 由于
i是int类型,赋值给input_byte时需强制转换为byte,匹配原代码的变量类型。
内容的提问来源于stack exchange,提问作者Edward Winch
相关产品推荐
相关产品推荐

