目次
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;
}
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
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は完全シロートでちょっと詰まってしまいました…。