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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:15:27