当第一个字节为负时,UInt8数组到带符号的十六进制字符串不起作用

我正在尝试将[UInt8]转换为十六进制字符串,就像可以在Java中这样完成:

byte[] bytes = {...};
System.out.println(new BigInteger(bytes).toString(16));

我的快速解决方案:

let bytes: [Int8] = [...]
print(bytes.reversed().map({ String(format: "%02hhx", $0) }).joined())

但是有两种情况:

  • 如果第一个字节为正:java和swift都给我相同的结果
  • 如果第一个字节为负:java给我一个负数(如预期),但是swift给我一个正数...

例:

byte[] bytes = {-100, -21, -46, 47, -99, 39, 67, 53, 62, -2, -23, 104, -15, 117, -9, 40, -31, 70, 4, 28};
System.out.println(new BigInteger(bytes).toString(16));
// -63142dd062d8bccac10116970e8a08d71eb9fbe4
let bytes: [Int8] = [-100, -21, -46, 47, -99, 39, 67, 53, 62, -2, -23, 104, -15, 117, -9, 40, -31, 70, 4, 28]
print(bytes.reversed().map({ String(format: "%02hhx", $0) }).joined())
// 1c0446e128f775f168e9fe3e3543279d2fd2eb9c

byte[] bytes = {112, -84, -89, 120, -123, 118, -50, -7, -115, -97, -127, 41, -71, 52, -4, 105, -5, -80, 115, 86};
System.out.println(new BigInteger(bytes).toString(16));
// 70aca7788576cef98d9f8129b934fc69fbb07356
let bytes: [Int8] = [112, -84, -89, 120, -123, 118, -50, -7, -115, -97, -127, 41, -71, 52, -4, 105, -5, -80, 115, 86]
print(bytes.reversed().map({ String(format: "%02hhx", $0) }).joined())
// 70aca7788576cef98d9f8129b934fc69fbb07356

快速实施有什么问题?