\r\n\r\n\r\n```","answerCount":1,"upvoteCount":0,"datePublished":"2020-08-29T07:44:27.159Z","dateModified":"2022-01-12T10:55:45.698Z","suggestedAnswer":[{"@type":"Answer","text":"ファイルの扱いは[ウェブアプリケーションからのファイルの使用](https://developer.mozilla.org/ja/docs/Web/API/File/Using_files_from_web_applications) に説明されています。\r\n\r\n> どこに問題があるのか\r\n\r\n**入力フィールドにイベントが未定義**です。\r\n\r\n冒頭のページも再確認し、イベント発火の順番、処理手順を確認してください。\r\n\r\n1. ``input[type=\"file\"]`` のイベントで FileList を取得\r\n2. ``input[type=\"file\"]``選択後のプロパティ``files``(FileList) から File を取得\r\n(ファイルが1つの場合も、FileListとして渡される)\r\n3. FileReader で内容を読む\r\n\r\n----\r\nCODEPEN [FileReaderでダンプ表示](https://codepen.io/AkitoshiManabe/pen/YzqQZgV?editors=1010)\r\n\r\n追記)\r\nコールバックによるネストが読みにくい場合、機能を細分化して実装しても良いかもしれません。\r\n```javascript\r\nfunction convertArrayBufferToHexArray (buf) {\r\n let\r\n u = new Uint8Array(buf),\r\n r = new Array(u.length),\r\n i = u.length\r\n ;\r\n while ( i-- )\r\n r[i] = u[i].toString(16).padStart(2,\"0\");\r\n return r;\r\n}\r\n\r\nfunction convertHexArrayToDumpData (hexChrs) {\r\n return hexChrs.reduce( function(a,c,i) {\r\n let m = i % 16; // modulo\r\n if( i && m === 0 ) a += \"\\n\";\r\n a += (m === 0 ? \"\": \" \") + c;\r\n return a;\r\n },\"\");\r\n}\r\n\r\n// 以下、ユーザ関数の動作確認\r\nvar sample = \"2020 August hello world\".match(/./g).map(s => s.charCodeAt(0));\r\nconsole.log( sample );\r\nvar buf = new Uint8Array( sample ).buffer; // ArrayBuffer\r\nconsole.log( buf );\r\nvar rslt = convertArrayBufferToHexArray(buf);\r\nconsole.log( rslt );\r\nvar dump = convertHexArrayToDumpData(rslt);\r\nconsole.log( dump );\r\n```","dateModified":"2020-08-30T05:32:03.651Z","datePublished":"2020-08-29T08:11:39.845Z","upvoteCount":0,"url":"https://teratail.com/questions/288289#reply-408769","comment":[{"@type":"Comment","text":"ご回答ありがとうございました。\r\n読み込むファイルは 1つだけなので、見本となるコードをそのままコピーして使用しました。\r\n従って、FileList を取得する理由そのものが存在しないのではないかと思われますが、どのような訂正をすれば、下記のコードが動くのかが\r\nまだ何も分かりません。\r\n\r\nコードの訂正方法をご指導いただければ幸いです。","datePublished":"2020-08-30T03:49:59.081Z","dateModified":"2020-08-30T03:49:59.081Z"},{"@type":"Comment","text":"> FileList を取得する理由\r\n「DOM の実装でFileListを取得する」のが理由です(必ず取得されるわけです)。\r\n考え方は Listと名が付くように、Arrayのように扱います([...ev.target.files])。\r\nFileが1つの場合、 forEach() でのループの処理(コールバック関数の処理)に着目してください。\r\nMDNのコードサンプルのようにfor ループで files[0] を使う箇所がありますが、FileListは「添字」でもアクセスできます。","datePublished":"2020-08-30T04:03:45.155Z","dateModified":"2020-08-30T04:03:45.155Z"}]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"トップ","url":"https://teratail.com"},{"@type":"ListItem","position":2,"name":"DOMに関する質問","url":"https://teratail.com/tags/DOM"},{"@type":"ListItem","position":3,"name":"DOM","url":"https://teratail.com/tags/DOM"}]}}}
質問するログイン新規登録
DOM

DOMは、Document Object Modelの略で、HTML文書やXML文書をアプリケーションから利用するためのAPIです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

980閲覧

binary code で記録されたファイルをブラウザから読み込んで、16進コードに変換してWEB上に表示させるには

xmg

総合スコア20

DOM

DOMは、Document Object Modelの略で、HTML文書やXML文書をアプリケーションから利用するためのAPIです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/08/29 07:44

0

0

お世話になります。
今朝おたずねした質問に対していただいた回答が、残念ながら作動しませんでした。
どこに問題があるのかお教えいただけますでしょうか。

実現したいこと

題名どおり、バイナリのファイルをブラウザ上で16進数で表示すること

発生している問題

DOMで読み込んだファイルの内容ではなく、blob 設定の初期値がスクリプト作動後も同じまま表示されるため、コード変換の結果が出されない

よろしくお願いいたします。

html

1 2<!DOCTYPE html><html> 3<head><meta charset="UTF-8"> 4</head> 5<body> 6 7<br> 8 <input type="file" id="readFile"> 9<hr> 10 <div id="result"></div> 11 12<script> 13 14var newFile = new Blob(['2020 August hello world']); 15 16var resultElement = document.getElementById( "result" ) ; 17 18var fr = new FileReader(); 19 20fr.addEventListener('load', 21 function () 22 { 23 var u = new Uint8Array(this.result), 24 a = new Array(u.length), 25 i = u.length; 26 27 while (i--) // map to hex 28 a[i] = (u[i] < 16 ? '0' : '') + u[i].toString(16); 29 30 u = null; // free memory 31 32 resultElement.appendChild( new Text( a ) ) ; 33 } 34); 35 36fr.readAsArrayBuffer(newFile); 37 38 39</script> 40</body> 41</html>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ファイルの扱いはウェブアプリケーションからのファイルの使用 に説明されています。

どこに問題があるのか

入力フィールドにイベントが未定義です。

冒頭のページも再確認し、イベント発火の順番、処理手順を確認してください。

  1. input[type="file"] のイベントで FileList を取得
  2. input[type="file"]選択後のプロパティfiles(FileList) から File を取得
    (ファイルが1つの場合も、FileListとして渡される)
  3. FileReader で内容を読む

CODEPEN FileReaderでダンプ表示

追記)
コールバックによるネストが読みにくい場合、機能を細分化して実装しても良いかもしれません。

javascript

1function convertArrayBufferToHexArray (buf) { 2 let 3 u = new Uint8Array(buf), 4 r = new Array(u.length), 5 i = u.length 6 ; 7 while ( i-- ) 8 r[i] = u[i].toString(16).padStart(2,"0"); 9 return r; 10} 11 12function convertHexArrayToDumpData (hexChrs) { 13 return hexChrs.reduce( function(a,c,i) { 14 let m = i % 16; // modulo 15 if( i && m === 0 ) a += "\n"; 16 a += (m === 0 ? "": " ") + c; 17 return a; 18 },""); 19} 20 21// 以下、ユーザ関数の動作確認 22var sample = "2020 August hello world".match(/./g).map(s => s.charCodeAt(0)); 23console.log( sample ); 24var buf = new Uint8Array( sample ).buffer; // ArrayBuffer 25console.log( buf ); 26var rslt = convertArrayBufferToHexArray(buf); 27console.log( rslt ); 28var dump = convertHexArrayToDumpData(rslt); 29console.log( dump );

投稿2020/08/29 08:11

編集2020/08/30 05:32
AkitoshiManabe

総合スコア5434

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xmg

2020/08/30 03:49

ご回答ありがとうございました。 読み込むファイルは 1つだけなので、見本となるコードをそのままコピーして使用しました。 従って、FileList を取得する理由そのものが存在しないのではないかと思われますが、どのような訂正をすれば、下記のコードが動くのかが まだ何も分かりません。 コードの訂正方法をご指導いただければ幸いです。
AkitoshiManabe

2020/08/30 04:03

> FileList を取得する理由 「DOM の実装でFileListを取得する」のが理由です(必ず取得されるわけです)。 考え方は Listと名が付くように、Arrayのように扱います([...ev.target.files])。 Fileが1つの場合、 forEach() でのループの処理(コールバック関数の処理)に着目してください。 MDNのコードサンプルのようにfor ループで files[0] を使う箇所がありますが、FileListは「添字」でもアクセスできます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問