fopen_s(&f, "testfile.bin", "wb"); for (unsigned char i = 0; i < 256; ++i) { fputc(i, f); } fclose(f);
で出力したファイルを fread すると普通に 7F の次は 80 になるのに、pwsh から
Get-Content testfile.bin | program.exe
みたいにパイプして stdin を fread すると 7F の次が EF BF BD と 3 バイトに膨れる。
あ、その前に 1A のところで EOF と思って止まってしまうので
_setmode(_fileno(stdin), _O_BINARY);
とかいうものも必要。(stdin の freopen はできない?)
で、80 が EF BF BD になる問題。
最初は 80 が EF になるのかと思って、キャストすれば直る? とか思ったけど、よく見ると EF じゃなくて EF BF BD になっているので、signedness とかより、エンコーディング関係の問題に見える。
結論としては、pwsh の Get-Content が勝手にテキストとして処理しているのが悪かったので、
Get-Content -AsByteStream testfile.bin | program.exe
なら問題なかった。
他のプログラムからのバイナリデータはどうなるのかは未確認。
windows の微妙に portable にならない部分が気持ち悪いのは前からだけど、pwsh も罠だらけだ。(標準 powershell や古い pwsh と pwsh7.4 でそれぞれ違ったりする)