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

调用外部ScanState.exe时输出显示为空的问题排查

解决ScanState.exe输出含空字符的问题

问题根源

ScanState.exe的输出采用**UTF-16 LE(宽字符)**编码,而默认情况下StandardOutput使用系统默认编码(通常为ANSI)读取,导致每个有效字符后被插入空字节(\0),最终呈现为空白内容。

修复方案

1. 直接指定进程输出编码

在启动进程前,将输出和错误流的编码设置为Encoding.Unicode(对应UTF-16 LE),从根源避免空字符生成:

private void button1_Click(object sender, EventArgs e)
{
    System.Diagnostics.Process process = new System.Diagnostics.Process();
    process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    process.StartInfo.FileName = @"amd64\scanstate.exe";
    process.StartInfo.Arguments = "";
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.CreateNoWindow = true;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.RedirectStandardError = true;
    process.StartInfo.RedirectStandardInput = true;
    
    // 关键:指定UTF-16编码读取输出流
    process.StartInfo.StandardOutputEncoding = Encoding.Unicode;
    process.StartInfo.StandardErrorEncoding = Encoding.Unicode;
    
    process.Start();
    // 先读取流再等待进程退出,避免死锁
    string output = process.StandardOutput.ReadToEnd();
    string error = process.StandardError.ReadToEnd();
    process.WaitForExit();
    
    MessageBox.Show(output);
    MessageBox.Show(error);
}

2. 修复已读取的含空字符字符串

如果已经获取了带\0的字符串,可通过以下两种方式清理:

// 方式1:直接移除所有空字符
string cleanedText = q.Replace("\0", "");

// 方式2:将字节数组按UTF-16重新解码
byte[] rawBytes = Encoding.Default.GetBytes(q);
string cleanedText = Encoding.Unicode.GetString(rawBytes);

额外提示

  • 不要在while (!process.HasExited)循环中反复调用ReadToEnd(),该方法会阻塞到流结束,容易引发死锁,直接读取后等待进程退出更安全。
  • 从错误内容看,当前运行权限不足,需右键程序选择「以管理员身份运行」,或在项目属性中配置UAC权限要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 06:25:21