如何在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
相关产品推荐
相关产品推荐

