将 Span Id 从 long 转换为 String

Convert Span Id from long to String

如何将从 span.context().spanId() 检索到的 Brave Span id 转换为包含其 64 个低位十六进制编码位的 String。 Sleuth 包含一个静态实用程序方法 Span.idToHex() 来执行此操作。他们是勇敢的等价物吗? Long.toHexString() 是一个候选人,但我们发现了我们必须在字符串左侧填充的问题。

我看到自从 Brave 版本 5.6.0 there is the spanIdString() Returns the hex representation of the span's ID.

这在内部使用 HexCodec 中的 toLowerHex(long v)。据我所知,这是自版本 4.9.0 以来的当前形式。在此之前,该方法自版本 4.0.0 以来就存在,但形式有所不同。此方法是 public,您可以使用它,但要小心,因为包名称暗示它不是 public API,我希望它可以在未来的版本中更改.

除此之外,我还查看了 Sleuth's Span.idToHex(),发现它在内部使用了 Long.toHexString()。它什么都不做。

Long.toHexString() is a candidate, but we saw issues where we had to left pad our string.

The Brave 的 spanId8-byte number。十六进制表示可能是 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

希望对您有所帮助!