【问题标题】: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 是完全相同的值吗?刚才我发现这个问题甚至不是在问值的“转换”,而是试图问如何以不同的格式呈现相同的值。

标签: java go casting char integer


【解决方案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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 2023-03-29
    • 2014-06-15
    相关资源
    最近更新 更多