stream銆俠oxed_字节序及 Go encoding/binary 库

最近工作之余在研究比特币 Go 实现源码,当看到 wire 部分时,发现测试代码里面初始化区块头整型字段十六进制的字节序都反转存储。

nonce := uint32(123123) // 0x1e0f3

pver := uint32(70001)

// baseBlockHdr is used in the various tests as a baseline BlockHeader.

bits := uint32(0x1d00ffff)

baseBlockHdr := &BlockHeader{

Version: 1,

PrevBlock: mainNetGenesisHash,

MerkleRoot: mainNetGenesisMerkleRoot,

Timestamp: time.Unix(0x495fab29, 0), // 2009-01-03 12:15:05 -0600 CST

Bits: bits,

Nonce: nonce,

}

// baseBlockHdrEncoded is the wire encoded bytes of baseBlockHdr.

baseBlockHdrEncoded := []byte{

0x01, 0x00, 0x00, 0x00, // Version 1

0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72,

0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f,

0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c,

0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, // PrevBlock

0x3b, 0xa3, 0xed, 0xfd, 0x7a, 0x7b, 0x12, 0xb2,

0x7a, 0xc7, 0x2c, 0x3e, 0x67, 0x76, 0x8f, 0x61,

0x7f, 0xc8, 0x1b, 0xc3, 0x88, 0x8a, 0x51, 0x32,

0x3a, 0x9f, 0xb8, 0xaa, 0x4b, 0x1e, 0x5e, 0x4a, // MerkleRoot

0x29, 0xab, 0x5f, 0x49, // Timestamp

0xff, 0xff, 0x00, 0x1d, // Bits

0xf3, 0xe0, 0x01, 0x00, // Nonce

}

直接对字节底层操作显然是最高效的做法。Go 语言的 encoding/binary 包构建二进制协议非常有效。

二进制协议

基于文本类型的协议(比如 JSON)和二进制协议都是字节通信,他们不同点在于他们使用哪种类型的字节和如何组织这些字节。

文本协议只适用于 ASCII 或 Unicode 编码可打印的字符通信。例如 "26" 使用 "2" 和 "6" 的 utf 编码的字符串表示,这种方式方便我们读,但对于计算机效率较低。

在二进制协议中,同样数字 "26" 可使用一个字节 0x1A 十六进制表示,减少了一半的存储空间且原始的字节格式能够被

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值