如何将我从中检索span.context().spanId()
到的 Brave Span id 转换为String
包含其 64 个低十六进制编码位的 id。Sleuth 包含一个静态实用程序方法,Span.idToHex()
它可以做到这一点。他们是勇敢的等价物吗?Long.toHexString()
是一个候选人,但我们看到了我们不得不留下我们的字符串的问题。
问问题
527 次
1 回答
1
我看到自 Brave 版本5.6.0以来就有spanIdString()
which Returns the hex representation of the span's ID
。
这在内部使用toLowerHex(long v)
in HexCodec
。4.9.0
据我所知,这具有自版本以来的当前形式。在此之前,该方法自版本以来就存在,4.0.0
但形式有所不同。这个方法是public
并且你可以使用它,但是要小心,因为包名称暗示它不是公共 API,我希望它可以在未来的版本中改变。
除此之外,我查看了Sleuth'sSpan.idToHex()
并看到内部使用Long.toHexString()
. 它不再做任何事情。
Long.toHexString() 是一个候选者,但我们看到了我们必须留下填充字符串的问题。
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
希望这可以帮助!
于 2019-03-26T23:06:20.737 回答