Opentelemetry 字节数组转十六进制字符串源码解析
在分布式追踪系统中,通常需要讲二进制格式的 Trace ID 转换为可读的字符串格式,比如 TraceId 类提供的这个方法,里边的位运算设计的非常巧妙。
复制代码
traceIdBytes 对应一个 16 字节,也就是 128 个二进制位,每一个字节的高 4 位和低 4 位分别转换成十六进制字符,最终会转换为长度为 32 的字符串。
有符号的 byte 转换为无符号的整数
复制代码
在 Java 中,byte 类型是有符号的,范围是-128 到 127,而我们在处理十六进制转换时,需要的是无符号类型,比如:
复制代码
value & 255 的作用就是将 byte 值转换为无符号的整数(范围 0-255)
复制代码
从 ENCODING 数组直接获取十六进制字符
在获取每一个无符号整数高 4 位和低 4 位对应的十六进制字符时,并没有每次都会去计算,而是通过已经计算好的数组来实现的。
复制代码
我们来看一下 ENCODING 数组是如何提前做好计算的
复制代码
ENCODING 数组的容量是 512,数组下标 0-255 存放数组下标这个整数高 4 位对应的字符,而低 4 位对应的字符,则放在下标+256 的位置。比如下标 171,ENCODING[171]存放 171 这个整数高 4 位对应的字符,而 171 的低 4 位对应的字符,则放在下标 171+256=427 的位置。
复制代码
由于 4 位二进制位对应的整数范围位 0-15,因此通过长度为 16 的字符串"0123456789abcdef"的 charAt 方法直接获取即可。
实例
复制代码
版权声明: 本文为 InfoQ 作者【喝水不抬头】的原创文章。
原文链接:【http://xie.infoq.cn/article/8bed544a3731f6fde50822f77】。文章转载请联系作者。







评论