将长整数转换为字符/符文

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.

【讨论】:

以上是关于将长整数转换为字符/符文的主要内容,如果未能解决你的问题,请参考以下文章

java 16进制字符串怎么转换成10进制字符串

将长整数列表转换为整数

如何获取二进制字符串的有符号数表示

RHEL环境下调试Shell脚本时遇到字符串转换整数的问题

如何将长整数时间转换为 NSString 或 NSDate 以显示时间?

Android String占位符功能