7

問題

2 つの int と可変長の文字列をバイトに変換する必要があります。

私がしたこと

各データ型をバイト配列に変換してから、バイト バッファーに追加しました。その直後に、以下に示すように、そのバッファーを 1 つのバイト配列にコピーします。

byte[] nameByteArray = cityName.getBytes();
byte[] xByteArray = ByteBuffer.allocate(4).putInt(x).array();
byte[] yByteArray = ByteBuffer.allocate(4).putInt(y).array();
ByteBuffer byteBuffer = ByteBuffer.allocate(nameByteArray.length + xByteArray.length + yByteArray.length);

これは少し冗長に思えます。確かにすべてをバイト バッファーに配置し、それをバイト配列に変換できます。ただし、弦の長さはわかりません。この場合、バイトバッファをどのように割り当てるのでしょうか? (バイトバッファを割り当てるには、その容量を指定する必要があります)

4

3 に答える 3

9

String を ByteBuffer に直接入れることはできないため、常に最初にバイト配列に変換する必要があります。そして、バイト配列形式でそれを持っている場合、それが長さであることを知っています。

したがって、最適化されたバージョンは次のようになります。

byte[] nameByteArray = cityName.getBytes();
ByteBuffer byteBuffer = ByteBuffer.allocate(nameByteArray.length + 8);
byteBuffer.put(nameByteArray);
byteBuffer.putInt(x);
byteBuffer.putInt(y);
于 2011-08-31T13:46:34.033 に答える
4

すべてを1つのバイトバッファに入れたいと仮定すると、なぜ次のことができないのですか

ByteBuffer byteBuffer = ByteBuffer.allocate( cityName.getBytes().length+ 4+ 4);
byteBuffer.put(cityName.getBytes()).putInt(x).putInt(y);
于 2011-08-31T13:46:47.117 に答える
1

文字列の最大長を制限しない限り、文字列を格納するために必要なバイト数を常に動的に計算する必要があります。文字列を最大長に制限すると、文字列を格納する最大バイト数を事前に計算し、適切なサイズの ByteBuffer を割り当てることができます。あなたが示した単純な例では必要ありませんが、文字列のバイト長と文字列を格納することを検討することをお勧めします。次に、データを読み返すと、文字列を構成するバイト数がわかります。

于 2011-08-31T13:58:16.860 に答える