惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
大猫的无限游戏
大猫的无限游戏
J
Java Code Geeks
MongoDB | Blog
MongoDB | Blog
Martin Fowler
Martin Fowler
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
Recent Announcements
Recent Announcements
F
Fortinet All Blogs
B
Blog
U
Unit 42
B
Blog RSS Feed
D
DataBreaches.Net
Google DeepMind News
Google DeepMind News
人人都是产品经理
人人都是产品经理
腾讯CDC
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
V
Visual Studio Blog
博客园 - 聂微东
MyScale Blog
MyScale Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
Engineering at Meta
Engineering at Meta

博客园 - 幽州散人

SQL优化案例 synchronized 为啥会让虚拟线程卸载失效 主线任务和使命 温州3日之旅 CompletableFuture + 异步Servlet:同步的姿势、异步的效果 Snowflake雪花算法与发号器的应用 windows Java 幽灵转发壳进程 也谈MySQL limit offset深翻页问题 SHOW SESSION STATUS 与 Handler 变量 MySQL 5.7 Profiles 执行性能分析 MySQL临时表与文件排序 MySQL 5.7 MRR多范围读优化 MySQL 5.7 ICP索引条件下推优化 MySQL符合索引与最左前缀原则 从I/O 的物理成本理解回表和索引覆盖 第4个电瓶以及补漆 Flink原理:并行度与keyGroup桶 什么是数字批发银行 Java虚拟线程(三)实现原理 Java虚拟线程(二) Java虚拟线程(一) 大模型推理层服务化架构 传奇调查员之路:理智值-99,但我必须听懂深渊的语言 js里调用智能合约读/写函数的方法的区别 Redisson分布式锁 交易心得 DexScreener接口初探 某安全软件跑飞了。。 Ed25519算法签名与验签的Java实现 Tendermint拜占庭容错引擎
字节与其16进制字符表示转换的bug
幽州散人 · 2026-05-12 · via 博客园 - 幽州散人

1、原始的字节一旦用16进制字符表示,还原回字节的时候不能直接hexStr.getBytes()

String tHex = SmUtil.sm3(...); // 返回的是 64 个十六进制字符,如 "3a5f…”

BigInteger t = new BigInteger(tHex.getBytes()); // 这是 64 个 ASCII 码字节,不是 32 个哈希字节

hex字符串,就是对字节数据用16进制字符这个规则进行编码,然后转化为字符串。64个16进制字符算起来也是32字节。

tHex这里是32字节 hash byte的16进制字符串表示。 

那么tHex.getBytes()是还原为字节数组。但问题出在这里,是每个字符去还原为1个字节,变成了64字节。

byte[] tBytes = HexUtil.decodeHex(tHex);  这里是真正的还原,就是每2个字符作为一个字节,是32字节。

2、new BigInteger(byte[] src) 把字节数组当作有符号大端整数解析。如果 src[0] 的最高位是 1,BigInteger 会把它理解为负数,toByteArray() 还原时会在前面补一个 0x00 字节,导致长度多1个字节。

即,首先new BigInteger(1, src) 保证按照正数来处理,最高位又是1  t = new BigInteger(1, src) ,那么t.toByteArray()会在最前加0x00,来明确说这个是正数,避免最高位是1表示负数的歧义,  如果最高位是0那就不用补位了;如果是t = new BigInteger(src)且src最高位是1,那么t.toByteArray()不会在前面补充,最高位是0当然也不用补位。

new BigInteger(1, src) 数值是对的,但 toByteArray() 可能多一个 0x00,所以还原时要用 BigIntegers.asUnsignedByteArray(16, t) 来保证长度。