Шестнадцатеричная строка Dotnet для Java - PullRequest
3 голосов
/ 06 мая 2011

Возникла проблема, очень похожая на эту: Как читать .NET Guid в Java UUID .

За исключением того, что из удаленного svc я получаю шестнадцатеричную строку в следующем формате: ABCDEFGH-IJKL-MNOP-QRST-123456.

Мне нужно сопоставить GUID.ToByteArray () сгенерированный байтовый массив .net GH-EF-CD-AB-KL-IJ-OP-MN- QR- ST-12-34-56 в Java для целей хеширования.

Я немного растерялся, как разобрать это. Должен ли я отрезать часть 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];

Я знаю, это взломано, но подойдет для тестирования.

Ответы [ 2 ]

1 голос
/ 12 мая 2011

Превратить его в байт [] и пропустить первые 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));
    }
}
0 голосов
/ 12 мая 2011

Последняя группа из 6 байтов не инвертируется, потому что это массив байтов.Первые четыре группы меняются местами, потому что это четырехбайтовое целое число, за которым следуют три двухбайтовых целых числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...