我在。net 6项目中有以下代码:
using var stdout = Console.OpenStandardOutput();
stdout.Write(BitConverter.GetBytes((uint) 8));
stdout.Flush();
我从PowerShell运行像这样的./program.exe > ./output
。我期望输出是一个包含4字节的文件,具有以下十六进制值:08 00 00 00
。然而,输出实际上包含14字节:FF FE 08 00 00 00 00 00 00 00 0D 00 0A 00
.
我理解前2个字节是UTF16LE(维基百科)的BOM。最后4个字节是rn
(CRLF)。中间的字节是我写的,我相信是用UTF16LE编码的。
我不明白为什么要加这么多额外的信息。如果我直接写到stdout,为什么框架不假设我做了所有必要的编码,我写的正是我想写的字节。为什么它要添加这些额外的信息,我怎样才能阻止它这样做?我在用头撞墙。
<标题>上下文h1> 不能允许任何额外的字节写入,因为我正在使用Chrome Native Messaging,它期望前4个字节是消息的长度,然后是消息本身。它使用stdout/stdin在主机应用程序(c#应用程序在我的情况下)和扩展之间读/写。如果我可以写到另一个流,我马上就会写,但是我不能。 标题>这一切都是因为PowerShell。代码按预期工作并输出正确的字节,但PowerShell正在获取这些字节并将其编码为UTF16LE。
在cmd.exe
中运行Program.exe > output
会产生预期的结果。
谢谢你一千次@dmedine,我的头撞在墙上,但我只是在错误的环境中测试。