相当于PHP的包()?

时间:2016-02-28 19:39:38

标签: go binary pack

在PHP中,要对二进制数据进行编码,例如整数,浮点数等,我会执行以下操作:

<?php

$uint32 = pack("V", 92301);
$uint16 = pack("v", 65535);
$float = pack("f", 0.0012);

echo "uint32: " . bin2hex($uint32) . "\n"; // 8d680100
echo "uint16: " . bin2hex($uint16) . "\n"; // ffff
echo "float: " . bin2hex($float) . "\n"; // 52499d3a

如何将此代码带入Go?

2 个答案:

答案 0 :(得分:3)

为什么需要在pack()中的类型已经是语言本身的本地类型的语言中使用pack()等函数?

要对二进制数据进行编码,请使用包encoding/binary。复制代码:

package main

import (
    "bytes"
    "encoding/binary"
    "fmt"
)

func main() {
    buf := new(bytes.Buffer)
    byteOrder := binary.LittleEndian

    binary.Write(buf, byteOrder, uint32(92301))
    fmt.Printf("uint32: %x\n", buf.Bytes())

    buf.Reset()
    binary.Write(buf, byteOrder, uint16(65535))
    fmt.Printf("uint16: %x\n", buf.Bytes())

    buf.Reset()
    binary.Write(buf, byteOrder, float32(0.0012))
    fmt.Printf("float: %x\n", buf.Bytes())
}

playground

有了这个,它可以很容易地编码其他数据结构。您真的只需要将binary.Write的第三个参数更改为您希望的数据类型,该函数将执行all the magic

答案 1 :(得分:0)

这不是一个完整的答案,但是由于我一直在寻找以下对象,因此我认为它也可以帮助其他人。

要直接等效于php的bin2hex(),可以执行以下操作:

func bin2hex(str string) string {
  return hex.EncodeToString([]byte(str))
}