Dotnet 十六进制字符串到 Java

本文关键字:Java 字符串 十六进制 Dotnet | 更新日期: 2023-09-27 17:55:35

有一个问题,就像这篇文章一样:如何将.NET Guid读入Java UUID。

除了,从远程 svc 我得到一个格式如下的十六进制 str:ABCDEFGH-IJKL-MNOP-QRST-123456 .

我需要匹配 GUID。ToByteArray() 在 Java 中生成了 .net 字节数组GH-EF-CD-AB-KL-IJ-OP-MN- QR- ST-12-34-56用于散列目的。

我有点不知道如何解析这个。我是否切断了QRST-123456部分,也许在另一部分使用类似 Commons IO EndianUtils 的东西,然后将 2 个数组重新拼接在一起?似乎太复杂了。我可以重新排列字符串,但我不必执行任何这些操作。谷歌先生也不想帮助我。

顺便说一句,小端区保持最后 6 个字符不变的逻辑是什么?


是的,作为参考,这是我所做的{抱歉'答案',但在评论中正确格式化它时遇到了问题}:

String s = "3C0EA2F3-B3A0-8FB0-23F0-9F36DEAA3F7E";
String[] splitz = s.split("-");
String rebuilt = "";
for (int i = 0; i < 3; i++) { 
  // Split into 2 char chunks. '..' = nbr of chars in chunks 
  String[] parts = splitz[i].split("(?<=''G..)"); 
  for (int k = parts.length -1; k >=0; k--) {
   rebuilt += parts[k]; 
  } 
 } 
 rebuilt += splitz[3]+splitz[4];

我知道,这很笨拙,但它可以进行测试。

Dotnet 十六进制字符串到 Java

把它变成一个字节[],跳过前3个字节:

package guid;
import java.util.Arrays;
public class GuidConvert {
    static byte[] convertUuidToBytes(String guid) {
        String hexdigits = guid.replaceAll("-", "");
        byte[] bytes = new byte[hexdigits.length()/2];
        for (int i = 0; i < bytes.length; i++) {
            int x = Integer.parseInt(hexdigits.substring(i*2, (i+1)*2), 16);
            bytes[i] = (byte) x;
        }
        return bytes;
    }
    static String bytesToHexString(byte[] bytes) {
        StringBuilder buf = new StringBuilder();
        for (byte b : bytes) {
            int i = b >= 0 ? b : (int) b + 256;
            buf.append(Integer.toHexString(i / 16));
            buf.append(Integer.toHexString(i % 16));
        }
        return buf.toString();
    }
    public static void main(String[] args) {
        String guid = "3C0EA2F3-B3A0-8FB0-23F0-9F36DEAA3F7E";
        byte[] bytes = convertUuidToBytes(guid);
        System.err.println("GUID  = "+ guid);
        System.err.println("bytes = "+ bytesToHexString(bytes));
        byte[] tail = Arrays.copyOfRange(bytes, 3, bytes.length);
        System.err.println("tail  =       "+ bytesToHexString(tail));
    }
}

最后一组 6 个字节不会反转,因为它是一个字节数组。前四组是相反的,因为它们是一个四字节整数,后跟三个双字节整数。