将Span Id从long转换为String

问题描述 投票:0回答:1

如何将我从span.context().spanId()检索到的Brave Span id转换为包含64个低十六进制编码位的String。侦探包含一个静态实用方法,Span.idToHex()就是这样做的。他们的勇敢等同吗? Long.toHexString()是一个候选人,但我们看到了我们不得不留下我们的字符串的问题。

html spring spring-boot tracing brave
1个回答
1
投票

我看到,因为勇敢版5.6.0spanIdString() Returns the hex representation of the span's ID

这内部使用toLowerHex(long v)中的HexCodec。据我所知,这是自版本4.9.0以来的当前形式。在此之前,该方法自版本4.0.0以来以某种不同的形式存在。这个方法是public你可以使用它,但是要谨慎,因为包名称提示它不是公共API,我希望它可以在将来的版本中更改。

除此之外,我看了Sleuth's Span.idToHex(),看到内部使用Long.toHexString()。它没有做更多的事情。

Long.toHexString()是一个候选者,但我们看到了一些问题,我们不得不留下我们的字符串。

勇敢者的spanId是一个8-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

希望这可以帮助!

© www.soinside.com 2019 - 2024. All rights reserved.