回答編集履歴

2

update

2016/12/30 13:37

投稿

yohhoy
yohhoy

スコア6191

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

1

update

2016/12/30 13:37

投稿

yohhoy
yohhoy

スコア6191

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