php pack golang实现
在 PHP 中,pack 函数用于将数据打包成二进制字符串,而 Golang 中可以通过 binary 包和 encoding 包实现类似功能。以下是 PHP pack 函数的 Golang 实现方法:
PHP pack 函数的基本用法
PHP 的 pack 函数格式如下:
$binary = pack("format", $data1, $data2, ...);
其中 format 是格式化字符串,指定如何打包数据。
Golang 实现方案
Golang 的 binary 包提供了 Write 和 Read 方法用于处理二进制数据。
使用 binary.Write 打包数据
package main
import (
"bytes"
"encoding/binary"
"fmt"
)
func main() {
buf := new(bytes.Buffer)
var data uint32 = 0x12345678
// 大端序打包(类似 PHP 的 'N' 格式)
err := binary.Write(buf, binary.BigEndian, data)
if err != nil {
fmt.Println("binary.Write failed:", err)
}
fmt.Printf("Packed data: %x\n", buf.Bytes())
}
处理不同格式
Golang 需要显式指定字节序(大端 BigEndian 或小端 LittleEndian),而 PHP 的 pack 格式字符隐含字节序:
PHP pack 格式 |
Golang 对应方式 |
|---|---|
c / C |
int8 / uint8 |
s / S |
int16 / uint16 + 字节序 |
n / v |
uint16 (n=大端, v=小端) |
i / I |
int32 / uint32 + 字节序 |
l / L |
int32 / uint32 + 字节序 |
N / V |
uint32 (N=大端, V=小端) |
f / d |
float32 / float64 + 字节序 |
示例:多数据打包
func packExample() {
buf := new(bytes.Buffer)
data1 := uint16(0x1234)
data2 := float32(3.14)
// 打包 uint16(大端)
binary.Write(buf, binary.BigEndian, data1)
// 打包 float32(小端)
binary.Write(buf, binary.LittleEndian, data2)
fmt.Printf("Packed: %x\n", buf.Bytes())
}
字符串处理
PHP 的 a(空字符填充)、A(空格填充)格式:
// 'a10' 格式实现
str := "hello"
padded := make([]byte, 10)
copy(padded, []byte(str))
// padded 现在类似 PHP pack("a10", "hello")
// 'A10' 格式实现
spacePadded := []byte(str)
for len(spacePadded) < 10 {
spacePadded = append(spacePadded, ' ')
}
注意事项
- Golang 是强类型语言,需要明确指定数据类型和字节序。
- 对于复杂格式(如 PHP 的
H*十六进制),可能需要手动处理。 - 浮点数转换需注意精度问题。
通过 binary 包和手动字节操作,可以覆盖 PHP pack 的大部分功能。







