我遇到了一种情况,我想将字节数组转换为int64数组,而我正在尝试执行以下操作
func covertToInt64(message []byte) []int64{
rbuf := bytes.NewBuffer(message)
arr := []int64{}
e := binary.Read(rbuf, binary.LittleEndian, &arr)
if e != nil {
}
return arr
}
上面的代码返回一个空的arr,但是当我将[] byte转换为以下字符串时
msg:=string(message)
msg的值为“ [1,2]”
我可以在Go中知道更好,更正确的方法吗?
答案 0 :(得分:0)
问题是您到底想要什么? 如果消息是从0到0xFF的字节值,而您只想将切片的每个成员转换为int64,则答案是:
ints := make([]int64, len(message))
for index, b := range message {
ints[index] = int64(b)
}
如果消息是表示int64值的二进制数据,则解决方案要比这复杂得多。因为int64每个都有8个字节长,所以要能够转换一个字节片,消息的长度必须被8整除,并且最好不要有任何余数。我们在这里删除其他情况。
那么,答案是:
ml := len(message)
il := ml/8
if ml%8 != 0 {
// there's more than il*8 bytes, but not
// enough to make il+1 int64 values
// error out here, if needed
}
ints := make([]int64, il)
err := binary.Read(bytes.NewReader(message), ints)
问题是,当您调用binary.Read时,您需要事先知道目标值的大小。读取失败,原因是:目标长度为零,并且源长度不足以读取单个int64值。
我想第二种情况要复杂一些,第一种情况可以解决您真正想要的。