質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

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

Q&A

2回答

1712閲覧

とても長大な文字列と Uint8Array に格納されたデーターを合成する方法

xmg

総合スコア20

JavaScript

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

0グッド

0クリップ

投稿2020/10/14 07:32

解決したいこと

複数の異なる形式で保存されている 16進データーを
すべて1つに継ぎ足して
バイナリーファイルとして javascript 上で作成する方法
.

すでに手元にある 16進データーの種類

[1] 文字列変数に保存されている 1000文字以上の 16進コード 空白なし
[2] 同上 10文字以内の 16進コード 文字列
[3] Uint8Array 形式で作られた変数

データー見本

data

1// 合成する前の各データー 3種類 2 3stringLong = "B744C12B58C09AEE3700 ... 000000FF00FF" ; 4stringShort = "8C0409AE37" ; 5 6u8a = Uint8Array([0xe0, 0x4d, 0x54, 0x72, 0x6b, 0x00, 0x00, 0x15]) ; 7

継ぎ足された 上記データーをバイナリーファイルとして保存する方法

上記 [1] のデーターを保存するのに用いたコードの主要部分は
以下のとおりです。

javascript

1 2// ファイル出力方法 3 4function saveBuffer( bytesD ) 5{ 6 var dataToSave = new Uint8Array( bytesD ); 7 8 var blob = new Blob([dataToSave], {type: "application/octet-binary"}); 9 10 var urlObj = URL.createObjectURL(blob); 11 12// . . . . 13

質問内容

どのようなコードを作成すれば、上記のような異なる型のデーターをひとまとめにして
バイナリーファイルを作れるか、ご指導をお願いいたします。

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

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

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

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

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

guest

回答2

0

とても長大な文字列

1000文字ですと、メモリ上では長大とは言えません。

文字コードがUTF-8の場合、日本語は**約3〜4[Byte/字]**と考えると、1000文字は約3〜4KBです。
現在使用されている画像ファイル1枚に比べてみると、微々たるものと考えられるはずです。

バイナリーファイルとして javascript 上で作成する方法

文字コードはコンピュータ版の数秘術のように考えると理解しやすいかもしれません
(中でもゲマトリア文字コードエンコーディングに近い)。

文字列とバイト配列を扱うなら Unicode について調べてみてください。

[1] 文字列変数に保存されている 1000文字以上の 16進コード 空白なし

[2] 同上 10文字以内の 16進コード 文字列

  1. 00FF を 1byte分のデータとしている
  2. 文字列長は 2の倍数

javascript

1function hex2bytes ( hex ) { 2 if( hex.length % 2 == 0 ) { 3 return hex.match(/[a-f\d]{2}/ig).map(n=>parseInt(n,16)); // i フラグ追記 4 } 5 return []; 6} 7 8 9var dataToSave = new Uint8Array( hex2bytes(bytesD) );

[3] については、前回のご質問回答したコードが参考になりませんでしょうか。

console.log( dv.buffer );

// => ArrayBuffer(47) {}

MDN

MDN のページはPCブラウザで閲覧し、左のサイドメニューにある「関連トピック」のページは読み漁ります
(オブジェクトのもつ他のプロパティについて理解できるはずです)。

投稿2020/10/14 09:36

編集2020/10/14 09:40
AkitoshiManabe

総合スコア5434

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

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

0

文字列 => 16進Array

js

1let text = '00112233445566778899AABBCCDDEEFF'; 2let xs = text.match(/.{1,2}/g).map(x => parseInt(x, 16)); 3console.log(xs); 4 5/* 6[ 7 0, 17, 34, 51, 68, 8 85, 102, 119, 136, 153, 9 170, 187, 204, 221, 238, 10 255 11] 12*/ 13

結合

  • 結合後のサイズを持つUint8Arrayを生成して、set()するとか
  • 普通の配列の配列にしてflat()してUint8Arrayを生成するか

js

1xs = new Uint8Array([1, 2, 3]) ; 2ys = [4, 5, 6]; 3console.log(new Uint8Array([...xs, ys].flat())); 4/* 5Uint8Array(6) [ 1, 2, 3, 4, 5, 6 ] 6*/

投稿2020/10/14 07:54

編集2020/10/14 07:54
ozwk

総合スコア13553

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問