首页 > 解决方案 > 如何在 go 中读取二进制数据?(智能卡)将代码转换为 java

问题描述

我需要将以下代码转换为 Java 编程语言。[]字节{}是什么意思?什么是 uint8 类型?

func int8ToByte(int_val int) byte {
    buf := new(bytes.Buffer)
    err := binary.Write(buf, binary.LittleEndian, uint8(int_val))
    if err != nil {
        log.Fatal("binary.Write failed:", err)
    }
    return buf.Bytes()[0]
}

标签: javago

解决方案


[]byte{}是一个复合文字,它创建一个空字节切片(类型为[]byte)。该uint8类型是一个大小为 1 字节的无符号整数类型。在 Go 中,类型byte是 的别名uint8,所以byteuint8是等价的并且完全可以互换。

我不知道是谁编写了你的int8ToByte()​​函数,但这似乎是一种混淆。它所做的只是返回其参数的最低有效字节,这只不过是从to的简单转换intbyte

byte(int_val)

请参阅此 Go 示例:

func main() {
    fmt.Println(int8ToByte(0x01))
    fmt.Println(int8ToByte(0x0102))
    fmt.Println(int8ToByte(-1))

    var i int
    i = 0x01
    fmt.Println(byte(i))
    i = 0x0102
    fmt.Println(byte(i))
    i = -1
    fmt.Println(byte(i))
}

func int8ToByte(int_val int) byte {
    buf := new(bytes.Buffer)
    err := binary.Write(buf, binary.LittleEndian, uint8(int_val))
    if err != nil {
        log.Fatal("binary.Write failed:", err)
    }
    return buf.Bytes()[0]
}

它输出(在Go Playground上尝试):

1
2
255
1
2
255

要在 Java 中实现同样的效果,您只需将int数字转换为byte

 public static void main(String []args){
    int i = 0x01;
    System.out.println((byte)i);
    i = 0x0102;
    System.out.println((byte)i);
    i = -1;
    System.out.println((byte)i + " " + String.format("%x", (byte)i));
 }

这输出:

1
2
-1 ff

注意区别:Javabyte是有符号的,它的有效范围是-128..127,而 Gobyte是无符号的,它的有效范围是0..255. 但是两个输出的二进制表示是相同的。有关详细信息,请参阅用于 HOTP 的 Java 与 Golang (rfc-4226)


推荐阅读