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

Java 当第一个字节为负时,有符号十六进制字符串的Int8数组不起作用,java,swift,hex,biginteger,bigint,Java,Swift,Hex,Biginteger,Bigint,我正在尝试将[UInt8]转换为十六进制字符串,就像在java中可以这样做: 字节[]字节={…}; System.out.printlnnew BigIntegerbytes.ToString 16; 我的快速解决方案: let字节:[Int8]=[…] printbytes.map{Stringformat:%02hhx,$0}。已加入 但有两种情况: 如果第一个字节是正数:java和swift都给出相同的结果 如果第一个字节是负数:java按预期给我一个负数,但swift给我一个正数。。。

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

字节[]字节={…}; System.out.printlnnew BigIntegerbytes.ToString 16; 我的快速解决方案:

let字节:[Int8]=[…] printbytes.map{Stringformat:%02hhx,$0}。已加入 但有两种情况:

如果第一个字节是正数: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.printlnnew BigIntegerbytes.ToString 16; //-63142DD062D8BCC10116970E8A08D71EB9FBE4 let bytes:[Int8]=[-100,-21,-46,47,-99,39,67,53,62,-2,-23,104,-15,117,-9,40,-31,70,4,28] printbytes.map{Stringformat:%02hhx,$0}。已加入 //9cebd22f9d2743353efee968f175f728e146041c 但是

byte[]bytes={112、-84、-89、120、-123、118、-50、-7、-115、-97、-127、41、-71、52、-4、105、-5、-80、115、86}; System.out.printlnnew BigIntegerbytes.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] printbytes.map{Stringformat:%02hhx,$0}。已加入 //70aca7788576cef98d9f8129b934fc69fbb07356
swift实现有什么问题?

我最终编写了自己的解决方案,迭代字节并组合字符串。使用不同阵列进行测试,适用于正十六进制和负十六进制

扩展数据{ func toSignedHexString->String{ //创建一个空字符串 var结果= var first:Int8=0 //迭代字节 var bytes=map{byte in //转换为Int8 返回Int8bitPattern:字节 } while!bytes.i空{ //获取并删除第一个字节 让byte=bytes.removeFirst //检查此字节是否为第一个字节 如果result.isEmpty&&first==0{ //保存第一个字节 第一个=字节 }如果result.isEmpty&&first!=0,则为else{ //将前两个字节转换为十六进制 result.appendStringInt32first+1*256+Int32byte+first<0?1:0,基数:16,大写:false }否则{ //将其转换为十六进制 result.appendStringformat:%02hhx,第一个<0?Int32bytes.isEmpty?256:255-Int32byte%256:byte } } //返回最终结果 返回结果 } } 测试代码:

让bytes=Data[-100,-21,-46,47,-99,39,67,53,62,-2,-23,104,-15,117,-9,40,-31,70,4,28] printbytes.toSignedHexString==-63142DD062D8BCAC10116970E8A08D71EB9FBE4 //真的 设bytes2=Data[112,-84,-89,120,-123,118,-50,-7,-115,-97,-127,41,-71,52,-4,105,-5,-80,115,86] printbytes2.toSignedHexString==70aca7788576cef98d9f8129b934fc69fbb07356 //真的
@Ackdari我添加了我的swift游乐场的屏幕截图,我的代码正在正确编译。很抱歉,我的在线编译器没有正确的swift版本。您可能想查看BitIntegerI的swift替代方案。我不知道swift,但仅仅因为它没有输出您想要的结果并不意味着它是错误的。从阅读文档的一瞬间就可以清楚地看出%x表示…无符号32位整数无符号int,使用数字0–9和小写a–f以十六进制打印,hh修饰符表示…长度修饰符,指定以下d、o、u、x或x转换说明符应用于有符号字符或无符号字符参数。对我来说,你看到的行为与那些规范是一致的。。。a您希望转换[UInt8],但代码中有[Int8],b您的Java代码将包含BigInteger的二元补码二进制表示的字节数组转换为BigInteger,但Swift代码只是将Int8映射为十六进制表示=两个完全不同的东西,带-100十进制值的c Int8表示为10011100二进制=9C十六进制,这是Swift代码为您提供的。你应该读这篇文章。