teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

update

2016/12/30 13:37

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -1,3 +1,12 @@
1
1
  `fopen("hoge.dat", "w")`(テキストモード)ではなく`fopen("hoge.dat", "wb");`(バイナリモード)とすべきです。
2
2
 
3
3
  Windows環境のテキストモードでは、LF(`\n`)/0x0A は CR+LF(`\r`+`\n`)/0x0D+0x0A という2バイトへと変換されてしまいます。バイナリデータを出力するときは、バイナリモードの指定は必須です。C言語プログラムとしての**致命的な**バグですから、原則としてC言語プログラム側を**修正すべき**です。
4
+
5
+ ---
6
+
7
+ > しかし、今回のケースではCのプログラムには変更を加えられません。
8
+ > このソースで書かれたデータをNode.jsが解釈する方法はありますか?
9
+
10
+ 残念ながら、Node.js側で正しく復号(解釈)するのはおそらく**不可能**です。
11
+
12
+ 復号処理は「バイト並び0x0D+0x0Aを0x0Aへと戻す」のですが、正しいオリジナルデータの時点で0x0D+0x0Aの場合も**誤って**0x0Aへと逆変換してしまいます。言い換えると、ファイルに0x0D+0x0Aバイト並びがあったとき、それがオリジナルの0x0D+0x0Aという2バイトだったのか、0x0Aという1バイトだったのかを判断する手段がありません。何らかの仮定やデータ範囲の制約条件を置けるならば、復号できる可能性があるかもしれませんが...

1

update

2016/12/30 13:37

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -1,1 +1,3 @@
1
- `fopen("hoge.dat", "w")`ではなく`fopen("hoge.dat", "wb");`とすべきです。
1
+ `fopen("hoge.dat", "w")`(テキストモード)ではなく`fopen("hoge.dat", "wb");`(バイナリモード)とすべきです。
2
+
3
+ Windows環境のテキストモードでは、LF(`\n`)/0x0A は CR+LF(`\r`+`\n`)/0x0D+0x0A という2バイトへと変換されてしまいます。バイナリデータを出力するときは、バイナリモードの指定は必須です。C言語プログラムとしての**致命的な**バグですから、原則としてC言語プログラム側を**修正すべき**です。