0

バイトを文字列に変換したい。

私は 1 つの Android アプリケーションを持っておりflatfile、データ ストレージに使用しています。

にたくさんのレコードがあるとしますflatfile

ここでフラットファイルデータベースでは、私のレコードサイズとその10文字は固定されており、ここでは多くの文字列レコードシーケンスを保存しています.

しかし、フラット ファイルから 1 つのレコードを読み取ると、各レコードの固定バイト数になります。レコードごとに 10 バイトを書き込んだからです。

私の文字列がS="abc123"; のようなフラットファイルに保存されている場合abc123 ASCII values for each character and rest would be 0。バイト配列が であることを意味します[97 ,98 ,99 ,49 ,50 ,51,0,0,0,0]。そのため、バイト配列から実際の文字列を取得したいときは、その時点で以下のコードを使用しており、正常に動作しています。

しかし、私が与えると、inputString = "1234567890"問題が発生します。

public class MainActivity extends Activity {
    public static short messageNumb = 0;
    public static short appID = 16;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // record with size 10 and its in bytes.
        byte[] recordBytes = new byte[10];
        // fill record by 0's
        Arrays.fill(recordBytes, (byte) 0);

        // input string
        String inputString = "abc123";
        int length = 0;
        int SECTOR_LENGTH = 10;
        // convert in bytes
        byte[] inputBytes = inputString.getBytes();
        // set how many bytes we have to write.
        length = SECTOR_LENGTH < inputBytes.length ? SECTOR_LENGTH
                : inputBytes.length;

        // copy bytes in record size.
        System.arraycopy(inputBytes, 0, recordBytes, 0, length);

        // Here i write this record in the file.
        // Now time to read record from the file.
        // Suppose i read one record from the file successfully.

        // convert this read bytes to string which we wrote.
        Log.d("TAG", "String is  = " + getStringFromBytes(recordBytes));

    }

    public String getStringFromBytes(byte[] inputBytes) {
        String s;
        s = new String(inputBytes);
        return s = s.substring(0, s.indexOf(0));
    }
}

しかし、文字列が完全に 10 文字になると問題が発生します。その時点で、バイト配列に2つの0があるため、この行に s = s.substring(0, s.indexOf(0));

以下の例外が発生しています。

java.lang.StringIndexOutOfBoundsException: length=10; regionStart=0; regionLength=-1
at java.lang.String.startEndAndLength(String.java:593)
at java.lang.String.substring(String.java:1474)

文字列の長さが 10 の場合、どうすればよいでしょうか。

私には2つの解決策がinputBytes.length == 10あります-それ以外の場合はsubString条件を実行しないように確認できますcheck contains 0 in byte array

しかし、アプリケーションの多くの場所でこのことを使用したため、このソリューションを使用したくありません。それで、これを達成する他の方法はありますか?

あらゆる状況で機能する良い解決策を教えてください。最後に2番目のソリューションは素晴らしいと思います。(バイト配列に 0 が含まれていることを確認してから、部分文字列関数を適用します)。

4

2 に答える 2

1
public String getStringFromBytes(byte[] inputBytes) {
    String s;
    s = new String(inputBytes);
    int zeroIndex = s.indexOf(0);
    return zeroIndex < 0 ? s : s.substring(0, zeroIndex);
}
于 2012-12-29T09:35:16.037 に答える
0

この行がエラーの原因だと思います

s = s.substring(0, s.indexOf(0));

s.indexOf(0)

-1 を返します。おそらく、ゼロの ASCII コードを指定する必要があります。48

だからこれはうまくいく s = s.substring(0, s.indexOf(48));

indexOf(int) のドキュメントを確認してください

public int indexOf (int c) 導入されたバージョン: API レベル 1 指定された文字の最初のインデックスをこの文字列で検索します。文字の検索は、この文字列の先頭から始まり、末尾に向かって移動します。

パラメータ c 検索する文字。指定された文字のこの文字列内のインデックスを返します。文字が見つからない場合は -1 を返します。

于 2012-12-29T09:34:00.277 に答える