TL;DR : Java では、メソッドを介して文字列から取得した文字をバイトにキャストするとcharAt、常に同じ値が得られますか?
任意の (不明な) 文字エンコーディングでエンコードされたファイルを読み込んでいます。これらのファイルを解析して、「TAG」などの特定の単語を探す必要があります。「タグを探すとき、「タグ」のバイトはASCII表現と同じでなければならない」など、ファイルの内容に特定の制限を加えました。
たとえば、次のファイルがあるとします
0x00 0x11 0x22 0x33 0x54 0x41 0x47 0x77 0x88 0x99 0xaa 0xbb
。T、A、および G の ASCII 値はそれぞれ0x54、0x41および0x47であるため、バイト自体を解析することでファイル内の「TAG」を見つけることができます。
ただし、探しているバイトの値をハードコーディングする必要があります。これを行うには、「
0x00 0x11 0x22 0x330x54 0x41 0x470x77 0x88 0x99 0xaa 0xbb
StringcharAt(int i)メソッドを呼び出して、char をバイトにキャストします。たとえば、 「T」のバイト表現の
任意のバイト ( と呼ばれる) を検証する方法を次に示します。注: コードは実際にはそうではなく、検証アルゴリズムははるかに洗練されています。
これは、私のローカル マシンでは問題なく動作します。ただし、これは非常に奇妙なエンコーディングを含む可能性のあるマシンで実行されます。気になるのは、 で取得した文字をバイトにキャストすると、マシンによって異なる値が返されるのではないかということです。Java は常に s を UTF-16 文字エンコーディングでエンコードすることは知っていますが、文字列から文字に変換してからバイトに変換すると、奇妙な結果が生じるのではないかと心配しています。
つまり、要するに、文字列から取得した文字をキャストしますb
String tag = "TAG";
char t = tag.charAt(0);
if ((byte)t == b){
//magic goes here, such as comparing the 'A' and the 'G'
}
charAtchar
charAtバイトへのメソッドは常に同じ値をもたらしますか? それとも外的要因に依存しますか?
ご協力いただきありがとうございます!
注: バイトは非常に長くなる可能性があり、将来頻繁に変更される可能性があるため、バイト自体 (バイト配列など) をハードコーディングすることはできません。
1031 次
4 に答える
3
java.lang.string.charAtは常に 16 ビットの UTF-16 文字を返します。バイトにキャストすると常に同じになりますcharが、16 ビットの符号なしデータ型であるため、8 ビットの符号付きとしてキャストすると、byte望ましくない動作が発生する可能性があります。ただし、ソース データが ASCII の場合は、期待どおりの動作が得られます。
于 2012-07-24T18:31:23.847 に答える
2
YescharAt (int)は、Java 定義の char 型 (UTF-16) を返すため、常に同じ にキャストされbyteます。
反対String.getBytes()に、指定された文字セット、または何も指定されていない場合は OS のデフォルトの文字セットに応じてバイトを返します。
于 2012-07-24T18:30:07.973 に答える
0
それらを直接型キャストする代わりに、メソッドを使用できますCharacter.codePointAt(char c)。これにより、毎回同じ結果が保証されます。
于 2015-02-27T09:35:24.763 に答える
0
を使用して char をバイトに変換すると、(byte)すべてのシステムで同じ結果が得られます。
charただし、とを混在させる必要があることは非常にまれですbyte。どちらか一方を実際に使用する必要があります。概念を混同すると、ご想像のとおり、混乱が生じる可能性があります。
于 2012-07-24T18:26:36.050 に答える