将长整数转换为字符/符文
Posted
技术标签:
【中文标题】将长整数转换为字符/符文【英文标题】:Converting a long integer into a char/rune 【发布时间】:2021-02-28 19:49:45 【问题描述】:我正在尝试将我在 Java 中看到的内容重写为 Go。
在 Java 中,该示例使用 (char)1573346;
的类型转换将 int 1573346
转换为 char Ǣ
打印新值的 int 后,我得到 482;
的十进制 ascii
int num = 1573346;
char ascii = (char)num; // Ǣ
int asciiNum = (int)ascii; // 482
我找不到在 Go 中做同样事情的方法。
【问题讨论】:
使用rune
而不是char
将1573346
截断为 16 位真的是您打算在这里做的吗?数字 1573346
不直接映射到 unicode 代码点,所以这个结果只是因为 java 内部使用 16 位字符。
出于好奇,这个的用例是什么? (它看起来不像“真正的”Java 代码:它是您编写的那种代码来说明强制转换的怪癖,而不是因为您真的想要这些怪癖。)
用例是使用密钥进行异或加密。上面的代码只是使用 rune 而不是 char 时不起作用的部分。
您知道'Ǣ'
和482
是完全相同的值吗?刚才我发现这个问题甚至不是在问值的“转换”,而是试图问如何以不同的格式呈现相同的值。
【参考方案1】:
Java 的 char
类型是 2 字节或 16 位。当您在 Java 中执行 (char)num
时,会将 num
“修剪”为 16 位,保留最低 16 位。
要在 Go 中做同样的事情,首先将数字转换为 uint16
,然后再转换为 rune
(也可以选择转换为 string
以进行打印)。
请注意,在 Go 中,您不能将常量值 1573346
转换为 uint16
,因为该数字不能由 uint16
类型的值表示。所以你首先要把它赋值给一个变量,然后转换变量的值(这是允许的):
x := 1573346
fmt.Println(string(rune(uint16(x))))
哪些输出:
Ǣ
同:
fmt.Println(string(rune(482)))
尝试Go Playground 上的示例。
【讨论】:
非常感谢,效果很好。我刚刚使用了 string(rune(uint16(x))) 并且它有效。我确定这与 int 类型有关,但在 java 文档中找不到任何内容。【参考方案2】:https://play.golang.org/p/1eVgDANNTUT
package main
import "fmt"
func main()
var num = int(1573346)
var ascii = uint16(num)
var asciiNum = int(ascii)
fmt.Printf("%d %c %d", num, ascii, asciiNum)
1573346 Ǣ 482
Program exited.
【讨论】:
以上是关于将长整数转换为字符/符文的主要内容,如果未能解决你的问题,请参考以下文章