我正在尝试将[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
快速实施有什么问题?