各位同仁:
本人初次尝试使用golang进行开发。在用go进行socket对接java服务时需要读取数据流中的各种类型。
java的java.io.DataInputStream类有各种数据读取的实现,如readInt, readFloat, readUTF等。
目前在go中同样实现相应的方法,本人尝试
var x int32
b_buf := bytes.NewBuffer(b)
c,_ := b_buf.ReadByte()
fmt.Println(c)
binary.Read(b_buf, binary.BigEndian, &x)
fmt.Println(x)
可以读取int类型的数据。但是针对readUTF这种字符串类型的数据目前还不清楚如何操作。请各位大神给予帮助。
同时本人尝试使用
b3 := make([]byte,12)
l,err:=b_buf.Read(b3)
fmt.Println(l)
fmt.Println(err)
fmt.Println(string(b3))
此方法进行字节获取转化为string输出,发现可以转化成utf8的内容,中间有不少NUL STX占位符。最重要的是要去读的字符串需要的字节长度如何确认呢??
在java中使用readUTF可以直接从流中获得字符串的内容,在golang中如何实现类似java的readUTF功能!
谢各位!!
已经解决,和大家共勉。
```
// 因为JAVA中的writeUTF会自动在首部添加内容长度,所以需要根据长度进行数据切分。
func readUTF(b *bytes.Buffer)(string, error){
// 1.先获取内容长度
var n int16
bb := make([]byte,2)
b.Read(bb)
bb_buf := bytes.NewBuffer(bb)
binary.Read(bb_buf, binary.BigEndian, &n)
// fmt.Println("长度:",n)
// 2.再根据长度获得字符内容
b3 := make([]byte,n)
_,err:=b.Read(b3)
// fmt.Println(l)
// fmt.Println(err)
// fmt.Println("内容:",string(b3))
// 3.最终内容转化为string并输出
return string(b3),err
}
```
#2
更多评论
已经解决,和大家共勉。
// 因为JAVA中的writeUTF会自动在首部添加内容长度,所以需要根据长度进行数据切分。
func readUTF(b *bytes.Buffer)(string, error){
// 1.先获取内容长度
var n int16
bb := make([]byte,2)
b.Read(bb)
bb_buf := bytes.NewBuffer(bb)
binary.Read(bb_buf, binary.BigEndian, &n)
// fmt.Println("长度:",n)
// 2.再根据长度获得字符内容
b3 := make([]byte,n)
_,err:=b.Read(b3)
// fmt.Println(l)
// fmt.Println(err)
// fmt.Println("内容:",string(b3))
// 3.最终内容转化为string并输出
return string(b3),err
}
#1