Kotlin:通过有符号2'将十六进制字符串转换为有符号整数;补语是什么?
长话短说,我正在尝试将十六进制值字符串转换为有符号2的补码整数。我可以在Swift中的一行代码中完成这项工作,但由于某些原因,我在Kotlin中找不到类似的代码。String.ToInt或String.ToInt只需给出从16进制到10进制的转换。这适用于某些正值,但不适用于任何负值Kotlin:通过有符号2'将十六进制字符串转换为有符号整数;补语是什么?,kotlin,type-conversion,Kotlin,Type Conversion,长话短说,我正在尝试将十六进制值字符串转换为有符号2的补码整数。我可以在Swift中的一行代码中完成这项工作,但由于某些原因,我在Kotlin中找不到类似的代码。String.ToInt或String.ToInt只需给出从16进制到10进制的转换。这适用于某些正值,但不适用于任何负值 "FFD6".toInt(16).toShort() // gives -42 "002A".toInt(16).toShort() // gives 42 我怎么知道我
"FFD6".toInt(16).toShort() // gives -42
"002A".toInt(16).toShort() // gives 42
我怎么知道我想要带符号的2的补码?我已经使用了,根据它的输出,我想要的是有符号2的补码的十进制数,而不是简单的从16进制到10进制的直接转换
因此,“FFD6”应转到-42(正确,在Swift和C#中确认),“002A”应转换为42
我将感谢任何帮助,甚至任何线索在哪里寻找。因为是的,我已经搜索过了,我用谷歌搜索了很多问题,没有,我还没有找到一个好的答案
实际上我试着写我自己的代码来做带符号的2的补码,但到目前为止,它没有给我正确的答案,我很茫然。我真的希望有一个内置的命令来代替它;我觉得如果其他语言也有Kotlin应该具备的功能。对于2的补码,您需要知道类型有多大 “FFD6”和“002A”的示例都有4个十六进制数字(即2个字节)。 这和Kotlin
Short
一样大。 因此,在这种情况下,一个简单的解决方案是将十六进制解析为Int
,然后将其转换为Short
。 (您不能将其直接转换为短字符,因为这会导致负数超出范围的错误。)
(然后,如果需要,可以将其转换回Int。)
同样,您可以将8位(4字节)值处理为Int
s,将2位(1字节)值处理为byte
s
对于其他尺寸,您需要执行一些位操作。 基于for Java,如果您有例如3位十六进制数,您可以执行以下操作:
("FD6".toInt(16) xor 0x800) - 0x800 // gives -42
(此处
0x800
是设置了顶部位(即符号位)的三位数。 您将使用0x80000
表示五位数,以此类推。 此外,对于9-16位数字,您需要以Long
而不是Int
开头。 如果你需要>16位,它也不能放入长的,因此你需要一个任意精度的库来处理十六进制…对于2的补码,你需要知道类型有多大
“FFD6”和“002A”的示例都有4个十六进制数字(即2个字节)。 这和KotlinShort
一样大。 因此,在这种情况下,一个简单的解决方案是将十六进制解析为Int
,然后将其转换为Short
。 (您不能将其直接转换为短字符,因为这会导致负数超出范围的错误。)
(然后,如果需要,可以将其转换回Int。)
同样,您可以将8位(4字节)值处理为Int
s,将2位(1字节)值处理为byte
s
对于其他尺寸,您需要执行一些位操作。 基于for Java,如果您有例如3位十六进制数,您可以执行以下操作:
("FD6".toInt(16) xor 0x800) - 0x800 // gives -42
(此处0x800
是设置了顶部位(即符号位)的三位数。 您将使用0x80000
表示五位数,以此类推。 此外,对于9-16位数字,您需要以Long
而不是Int
开头。 如果您需要>16位数字,那么它也不能放入长的,因此您需要一个任意精度的库来处理十六进制…谢谢!所以如果我有,比如说,0xFFD6,我就不能用“0xFFD6”.toInt(16).toSort()来得到-42,对吗?我可以做“0xFFD6.toInt(16.toLong()”吗?试试看! 您可以运行kotlinc
,直接在REPL中键入程序和表达式。 键入““0xFFD6”.toInt(16).toShort()”会产生NumberFormatException,因为它无法解析0x
。 (我不知道有任何内置函数可以。) 和“FFD6”.toInt(16).toLong()
不做你想做的事(给出65494);是对Short
的截断整理了符号。谢谢!所以如果我有,比如说,0xFFD6,我就不能用“0xFFD6”.toInt(16).toSort()来得到-42,对吗?我可以做“0xFFD6.toInt(16.toLong()”吗?试试看! 您可以运行kotlinc
,直接在REPL中键入程序和表达式。 键入““0xFFD6”.toInt(16).toShort()”会产生NumberFormatException,因为它无法解析0x
。 (我不知道有任何内置函数可以。) 和“FFD6”.toInt(16).toLong()
不做你想做的事(给出65494);是对Short
的截断整理了符号。