Kotlin:通过有符号2'将十六进制字符串转换为有符号整数;补语是什么?

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 我怎么知道我

长话短说,我正在尝试将十六进制值字符串转换为有符号2的补码整数。我可以在Swift中的一行代码中完成这项工作,但由于某些原因,我在Kotlin中找不到类似的代码。String.ToInt或String.ToInt只需给出从16进制到10进制的转换。这适用于某些正值,但不适用于任何负值

"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个字节)。  这和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位数字,那么它也不能放入
长的
,因此您需要一个任意精度的库来处理十六进制…

谢谢!所以如果我有,比如说,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
的截断整理了符号。