2024-02-22 (Thu) [長年日記]

_ windows の stdin て面倒

   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 でそれぞれ違ったりする)


«前の日記(2024-01-21 (Sun)) 最新