1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

文字列を指定文字数で分解し、逆順で出力する

Last updated at Posted at 2021-03-22

目次

1.はじめに
2.リトルエンディアン
3.import
4.文字列を指定文字数で分解
5.逆順に並び替える
6.splitを使う場合

1.はじめに

…主に自分が見直すための記録です…

16進数の文字列データをリトルエンディアンにしたかった。

調べると split で正規表現を用いて分解する例が多かったが、今回は
0E0A0D6F0014A55F29
みたいな区切られていない文字列を
[0E,0A,0D,6F,00,14,A5,5F,29] (配列)
       ↓
295FA514006F0D0A0E (リトルエンディアン文字列)
にしたかった。

2.リトルエンディアン ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/721559/6f8fca4c-a7b9-5260-2513-84d68ba64e85.png)

3.import

以下をimportします。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

4.文字列を指定文字数で分解


import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SortingStrings {

    public static void main(String[] args) {
        String hexString = "0E0A0D6F0014A55F29";
        System.out.println("変換前:" + hexString);

        String result = sortingHex(hexString);
        System.out.println("変換後:" + result);
    }

    /**
     * 16進数文字列を逆順にする関数
     * 
     * @param str
     * @return result
     */
    public static String sortingHex(String str) {
        //Matcherで分割する文字数を指定する 今回は2文字で分割
        final Matcher m = Pattern.compile(".{1,2}").matcher(str);
        //Listを作成
        List<String> strList = new ArrayList<>();

        while (m.find()) {
            //作成したListに分割しながら挿入する
            strList.add(str.substring(m.start(), m.end()));
        }
        String result = strList.toString();
        //結果を返す
        return result;
    }
}

これで

変換前:0E0A0D6F0014A55F29
変換後:[0E, 0A, 0D, 6F, 00, 14, A5, 5F, 29]

と出力されます。

5.逆順に並び替える

Listを逆順に並び替えます。 sortingHexの中身のみ下記に示します。

 public static String sortingHex(String str) {
        // Matcherで分割する文字数を指定する 今回は2文字で分割
        final Matcher m = Pattern.compile(".{1,2}").matcher(str);
        // Listを作成
        List<String> strList = new ArrayList<>();

        while (m.find()) {
            // 作成したListに分割しながら挿入する
            strList.add(str.substring(m.start(), m.end()));
        }
        //ListのCollectionsで逆順にする
        Collections.reverse(strList);
        String result = strList.toString();
        return result;
    }

これで

変換前:0E0A0D6F0014A55F29
変換後:[29, 5F, A5, 14, 00, 6F, 0D, 0A, 0E]

と出力されます。リトルエンディアンになった!
配列形式ではなく文字列で出力したい場合は、

String result = strList.toString(); の部分を

String result = String.join("", strList);

とすればいい。
出力結果

変換前:0E0A0D6F0014A55F29
変換後:295FA514006F0D0A0E

6.splitを使う場合

~~変更前が0E:0A:0D:6F:00:14:A5:5F:29 みたいな形なら split が使える。~~ @saka1029 さん からのアドバイスを基に追記。 split を使えばもっと簡単でした! 正規表現の勉強をスルーしたつけがw

public static String sortingHex(String str) {
     List<String> strList = Arrays.asList(str.split("(?<=\\G..)"));
     Collections.reverse(strList);
     String result = String.join("", strList);
     return result;
}

JavaScriptだと slice とか、もっと書き方がわかるけどJavaは完全シロートでちょっと詰まってしまいました…。

1
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?