Конвертировать Span Id из long в String - PullRequest
0 голосов
/ 26 марта 2019

Как я могу преобразовать идентификатор Brave Span, который я извлек из span.context().spanId() в String, содержащий его 64-битные закодированные биты. Sleuth содержал статический служебный метод Span.idToHex(), который делал это. Это храбрый эквивалент? Long.toHexString() является кандидатом, но мы увидели проблемы, из-за которых нам пришлось дополнить нашу строку.

1 Ответ

1 голос
/ 27 марта 2019

Я вижу, что с версии Brave 5.6.0 существует spanIdString(), который Returns the hex representation of the span's ID.

. Для внутреннего использования используется * 1010.* в HexCodec.Это имеет текущую форму начиная с версии 4.9.0, насколько я могу судить.До этого метод существовал с версии 4.0.0, но в другой форме.Это метод public, и вы можете использовать его, однако с осторожностью, поскольку, как намекает название пакета, он не является публичным API, и я ожидаю, что его можно будет изменить в будущих выпусках.

Кроме этогоЯ посмотрел на Sleuth's Span.idToHex() и увидел, что внутренне использует Long.toHexString().Он больше ничего не делает.

Long.toHexString () является кандидатом, но мы видели проблемы, когда мы должны были дополнить нашу строку.

The Brave'sspanId - это 8-байтовое число .Шестнадцатеричное представление - это строка из 16 символов.Эта строка не должна быть дополнена слева.Это вопрос форматирования значения при его представлении.

Например, это:

System.out.println(String.format("%s", Long.toHexString(Long.MIN_VALUE)));
System.out.println(String.format("%s", Long.toHexString(-1L)));
System.out.println(String.format("%s", Long.toHexString(0L)));
System.out.println(String.format("%s", Long.toHexString(1L)));
System.out.println(String.format("%s", Long.toHexString(Long.MAX_VALUE)));

System.out.println(String.format("%X", Long.MIN_VALUE));
System.out.println(String.format("%X", -1L));
System.out.println(String.format("%X", 0L));
System.out.println(String.format("%X", 1L));
System.out.println(String.format("%X", Long.MAX_VALUE));

Выводит это:

8000000000000000
ffffffffffffffff
0
1
7fffffffffffffff

8000000000000000
FFFFFFFFFFFFFFFF
0
1
7FFFFFFFFFFFFFFF

Это допустимые шестнадцатеричные значения изаполнение отсутствует.

Если вы хотите, чтобы оно было представлено с нулевым заполнением, вы можете сделать это самостоятельно, как уже делали.Я, вероятно, сделал бы это так:

System.out.println(String.format("%016X", Long.MIN_VALUE));
System.out.println(String.format("%016X", -1L));
System.out.println(String.format("%016X", 0L));
System.out.println(String.format("%016X", 1L));
System.out.println(String.format("%016X", Long.MAX_VALUE));

Это вывело бы:

8000000000000000
FFFFFFFFFFFFFFFF
0000000000000000
0000000000000001
7FFFFFFFFFFFFFFF

Надеюсь, это поможет!

...