2016-04-11 5 views
0

は、私が働いている、私はこれらの規則で文字にバイトをマッピングする必要があります:0x24を包括的にバイナリデータをJavaScriptの文字にマップするにはどうすればいいですか? APIについては

  • バイトの0x20は、U + 0020 U + 0024包括的に対応する文字にマップされます。
  • バイト0x26〜0x7Eは、対応する文字U + 0026〜U + 007Eにマッピングされます。
  • 他のバイトは、パーセント文字とそれに続く2つの大文字の16進文字からなる3文字シーケンスにマップされます。バイト0は "%00"にマップされ、バイト0xABは "%AB"にマップされます。

これはエンコードのために、私はデコードのための機能も作らなければなりません。

これはおそらく既存のエンコードですか?私はそれをgoogled、しかし何も見つけることができませんでした。 私はU +がUnicodeであることを知っています。

if(bytesArray[i] == 0x21) 
{ 
    bytesArray[i] = U+0021; 
} 

は、私はちょうど同じようにマップすることはできますか?

+0

['String.fromCharCode()'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode) – Pointy

+2

たとえば、 'if(bytesArray [ i] == 0x21) 'エンコーディングを変更する必要はありません。(JavaScript規則ごとに) 'number'から 'string'に変更しない限り、エンコーディングを変更する必要はありません。 'bytesArray'はどのデータ型ですか? – usr2564301

+0

関数に渡されるデータ(指定による)は文字列です。 – ZIvesic

答えて

0

文字列の値を変換するので、String.replaceを使用できます。 実際にはの交換が必要なのは%XXの表記です。他の文字は変更されません。

この場合、あなたはreplaceコマンドのユーザー定義関数を使用することができます。

decodedArray = byteArray.replace (/%([0-9A-F][0-9A-F])/g, 
    function (match, p1) 
    { 
     return String.fromCharCode(parseInt(p1, 16)); 
    }); 

仕様ごとに、リテラル%文字が(エンコードされた文字列で表示されない場合がありますので、これは安全な操作ですあなたが疑問に思っている場合には:コード0x25は、それ以外は印刷可能なプレーンASCII範囲で選別されます)。ストレイ%が文字列に表示されても、実際に2つの有効な大文字の16進バイトが続く場合にのみ置換されます。

エンコーディングも同様に簡単です:

encodedArray = originalString.replace (/[^ -$&-~]/g, 
    function (match) 
    { 
     if (match.charCodeAt(0) < 16) 
      return '%0'+match.charCodeAt(0).toString(16).toUpperCase(); 
     return '%'+match.charCodeAt(0).toString(16).toUpperCase(); 
    }); 

注「試合」正規表現は、あなたに被変換されたコードのリストの正確なASCII表現です。すべての文字を検索したいので無効になります の範囲外です。

これは、各文字を手作業でループし、翻訳が必要かどうかを調べるためにそれを検査する必要があるため、マッピングより優れています。これはのコード(すべてのコードのリストがエンコードする1バイトまたは3バイトの文字列である必要があります)では合理的にうまくいくでしょうが、のデコードの場合、2バイト先に調べる必要があります有効な場合は(!)、そうであればスキップしてください。それに比べて、replaceソリューションははるかに高速でなければなりません。

+0

そうだと思います。 最初の関数の 'part'引数は何ですか? – ZIvesic

+0

@ZIvesic: 'replace'参照のためのリンクを追加しました。 'part'の正しい名前は実際には' p1'でした - [関数をパラメータとして指定する](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace #Specifying_a_function_as_a_parameter)。見つかった完全な文字列、または検索パラメータのいずれかのグループを使用することができます。この場合、置換機能でのみ最初のグループを使用します。 – usr2564301

+0

デコードでは、さらに2つの要求があります。 - パーセント文字の後に2つの大文字の16進文字がない場合、文字列が不正です。 - 文字列にU + 0020〜U + 007Eの範囲外の文字が含まれている場合、文字列の形式が正しくありません どうすれば追加できますか?私は最初に問題にそれを加えておくべきだった。私はJSには新しく、これは数日間苦労しています... – ZIvesic

関連する問題