You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中表示uint8字面量?(libsodium代码迁移场景)

Java复刻libsodium代码:无符号字节数组的SHA-256哈希问题

我最近在尝试用Java重新实现一段基于libsodium的代码,原C代码里声明了一个uint8_t类型的数组:

#define SECRET ((uint8_t[]){ 0xAA, 0xBB, 0xCC ... }) // not the real secret!

然后把这个数组传入了libsodium的crypto_hash_sha256_update函数来做哈希处理。

我的核心难点在于:Java里没有无符号字节类型,没法直接把0xAA这类十六进制值声明成byte——毕竟Java的byte是有符号的,0xAA对应的十进制是-86,直接写会编译报错。

我已经试了几种方法,但都没得到和原实现一致的测试结果:

  • 把数组声明成short/int类型:我担心这样会因为自动补零改变字节数据,实际测试也确实不对
  • 把字面量写成0b11110000...的二进制格式:结果依然不符合预期
  • 声明char[]数组拼接字面量:比如写final char[] salt = { 0xAABB, 0xCCDD, ...},还是得不到正确的哈希值

编辑补充:下面是我用short类型尝试的代码片段:

final short[] salt = { 0xAA, 0xBB, ...}; 
final Hasher hasher = Hashing.sha256().newHasher(); 
hasher.putLong(input); 
for (int i=0; i < salt.length; i++) { 
    hasher.putShort(salt[i]); 
} 
return hasher.hash().asBytes(); 

内容的提问来源于stack exchange,提问作者benhsu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:06:15