readAsBinaryString()
readAsArrayBuffer() を使ってください。
バイナリデータを JavaScript の {string}
で無理やり扱っていたのは
TypedArray 登場以前の古い JavaScript になります(開発者が文字化けを許容していた)。
MDN readAsBinaryString より
File APIの仕様から一度削除されましたが、後方互換のために再導入されました。
FileReader.readAsArrayBuffer() の使用が推奨されています。
Wikipedia コンピュータの数値表現(追記
再び 2進数
2進数の単位はbit
になりますので、 テキスト化された "0"
,"1"
の値はそれぞれ、16進数(単位はbyte
)の 0x30
,0x31
になるはずです。
逆の動作
HEX化したテキストの場合、byte単位(16進数)で考えます。
javascript
1// utf-8 1byte文字(可視文字)の範囲でHEX化してみる例(追記
2// [..."Hello,world!"].map( s=>s.charCodeAt(0).toString(16) ).join("");
3// => "48656c6c6f2c776f726c6421"
4var hexstring = "48656c6c6f2c776f726c6421";
5
6var bytes = hexstring.match(/[\da-f]{2}/ig)
7 .map( c => Number("0x"+c) ); // => バイト配列 / Uint8Array() に渡せる
8
9/*
10// 参考 binary-string : 1byte ごとに String.fromCharCode() で文字列化する
11var binstr = bytes
12 .map( n => String.fromCharCode(n) )
13 .join(""); // => "Hello,world!" 現在は utf-8 テキストデータに限って利用
14*/
15
16var dataToSave = new Uint8Array( bytes );
データ形式が定まっていないバイナリの mimeType は application/octet-stream
です。
上記コードの続きで
javascript
1//var blob = new Blob([dataToSave], {type: "application/octet-binary"});
2var file = new File([dataToSave], "filename", {type: "application/octet-stream"});
過去のご質問にも回答していますが、convertArrayBufferToHexArray()
は、ArrayBufferから、通常の配列に変換(各バイトの値は HEXで示す2文字にする)しています。
javascript
1// buf はfileから読んだ ArrayBuffer
2var hexstring = convertArrayBufferToHexArray( buf ).join("");
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/12 00:57
2020/09/12 02:34 編集
2020/09/16 01:23
2020/09/16 01:52 編集