英文:
Integer to Byte conversion in Java vs Go
问题
我想连接两个服务器应用程序。一个是用Java编写的,另一个是用Go编写的。它们都通过字节级别的简单协议进行通信。
在Go应用程序中,我得到了以下结果:
buf := bytes.NewBuffer(make([]byte, 0, 17))
binary.Write(buf, binary.LittleEndian, 1066249)
0 = {uint8} 79<br>
1 = {uint8} 74<br>
2 = {uint8} 16<br>
3 = {uint8} 0<br>
但是,如果我在Java应用程序中做同样的操作,我得到了以下数字:
byte[] result = ByteBuffer.allocate(Integer.SIZE / Byte.SIZE).order(ByteOrder.LITTLE_ENDIAN).putInt(1066249).array();
0 = 9<br>
1 = 69<br>
2 = 16<br>
3 = 0<br>
有人知道我在Java端做错了什么吗?
英文:
I want to connect two server apps. One is written in Java and the other one in Go. Both communicate via a simple protocol on byte level.
At the Go app I got this result:
buf := bytes.NewBuffer(make([]byte, 0, 17)
binary.Write(buf, binary.LittleEndian, 1066249)
0 = {uint8} 79<br>
1 = {uint8} 74<br>
2 = {uint8} 16<br>
3 = {uint8} 0<br>
But if I do the same in my Java app, I got this numbers:
byte[] result = ByteBuffer.allocate(Integer.SIZE / Byte.SIZE).order(ByteOrder.LITTLE_ENDIAN).putInt(1066249).array();
0 = 9<br>
1 = 69<br>
2 = 16<br>
3 = 0<br>
Does anybody know, what I'm doing wrong on the Java side?
答案1
得分: 4
当我尝试执行你分享的code时,它会给出一个正确的错误信息:
2009/11/10 23:00:00 写入缓冲区时出错,binary.Write: invalid type int
这是链接,解释了为什么不能使用任意大小的值。
推荐的方法是处理错误,错误代码会给出失败或意外行为的原因。这是一个能够产生与Java相同结果的工作代码:
package main
import (
"bytes"
"encoding/binary"
"fmt"
"log"
)
func main() {
buf := &bytes.Buffer{}
var data int32 = 1066249
err := binary.Write(buf, binary.LittleEndian, data)
if err != nil {
log.Fatalf("写入缓冲区时出错,%s", err.Error())
}
fmt.Printf("%v", buf.Bytes())
}
输出结果为:
[9 69 16 0]
这是工作代码的PlayGround链接。
英文:
When I try to execute the code you have shared, it gives a proper error message
2009/11/10 23:00:00 Error writing to the buffer, binary.Write: invalid type int
And here is the link why you can not use arbitrary size values
The recommended approach is to handle the error, the error code gives the reason for the failure or the unexpected behavior. Here is the working code that gives same result as java
package main
import (
"bytes"
"encoding/binary"
"fmt"
"log"
)
func main() {
buf := &bytes.Buffer{}
var data int32 = 1066249
err := binary.Write(buf, binary.LittleEndian, data)
if err != nil {
log.Fatalf("Error writing to the buffer, %s", err.Error())
}
fmt.Printf("%v", buf.Bytes())
}
output
[9 69 16 0]
Here is the PlayGround link to the working code
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论