- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个 4 长度的 slice 存储一个像这样的 int 值:
[159 124 0 0]
然后我尝试了 val, encodeBytes := binary.Uvarint(slice)
,但是出错了 val
:
val = 15903, encodebytes = 2
正确的val
应该是31903
,有什么问题吗?
代码如下:
最佳答案
根据二进制包文档,用于解释字节序列的编码是 available here .它指定字节被解释为:
Each byte in a varint, except the last byte, has the most significant bit (msb) set – this indicates that there are further bytes to come. The lower 7 bits of each byte are used to store the two's complement representation of the number in groups of 7 bits, least significant group first.
[159 124 0 0]
的二进制表示是:
1001 1111 , 0111 1100 , 0000 0000, 0000 0000
第一个字节的最高有效位 (MSB) 已设置,因此第二个字节也将被解释。第二个字节 MSB 未设置,因此其余字节将被忽略。
通过删除字节的 MSB 来解释我们得到的位:
001 1111 , 111 1100
这两组在被解释为数字之前被颠倒:
111 1100 , 001 1111
concatenated:
0011 1110 0001 1111
将其转换回十进制我们得到:
1 + 2 +4 + 8 + 16 + 0 + 0 + 0 + 0 + 512 + 1024 + 2048 + 4096 + 8192 = 15903
正如 James 和 peterSO 的帖子所示,您可能想改用 binary.LittleEndian.Uint32
。
关于go - binary.Uvarint 得到了比预期错误的 int 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21849857/
假设我有以下 2 字节数组,它是我从文件中读取的。 bits := []byte{3, 223} 我想将其解释为一个整数,即 991(0b11 来自第一个数字,0b11011111 来自第二个数字)。
我有一个通过监听端口设置的 TCP 数据包连接 (net.Conn)。 conn, err := ln.Accept() 我需要读取 Conn.Read([]byte) 缓冲区的第一个 UVarInt
我有一个 4 长度的 slice 存储一个像这样的 int 值: [159 124 0 0] 然后我尝试了 val, encodeBytes := binary.Uvarint(slice),但是出错
我是一名优秀的程序员,十分优秀!