Golang 中的字符串解码

标签 string go decoding string-decoding

在 Ruby 中,我使用 string.unpack 方法来解码一些数据。我正在将此代码迁移到 Golang 应用程序中,但是我在标准库中找不到相应的方法?

Ruby 代码为:str.unpack('>LLLff')

在 Go 中实现此功能的最佳方法是什么?


示例数据:

]\x00\x00@\x00\x8C\xD2\x00\x00\x00\x00\x00\x00\x00\x00h.\x9FAjK\x8FG\xC0T\x87UX\xA1CH\xB7\x80\x82}\xBB\xF9\x8F\xBAcqF{\xE31/Zx\xC0\x04\xFF\b\xA0\xBD\a\x9E\x0F\x14c+\b\xD3\xE8\xE1\xC2\x1C7\xBCmd/j\xC1H\x191~\x91F\b5-\x8A\x9F(\\\xF1\x16/\x0F\xEA\xD9\x94rV\xEC\xBB\xCB\x12qJ\x05\b\x04 {R\xB8\xA4\xA9\xD0)v\x97<\xCA\x92\xB6U\b)\x1D\x1D\xF1\x00\xE4U\x8DB\x16/v\xEC[bLTW\xB2\xFB\x0F\x91\x05\xAA\x9C\xBD\x8E\x1A\xFB\xDFUJ\xB8\xDE\xF5m\xC8Z\xC1\v\\|\r;\xB6\xE6\xA6\x13o\x91\xE1\xBA\x9An\x8B\x01W\xB9\"\x12+\x9B[\xC7\xCD\xC2O+\f^|\xE1G\x86.%m\xB2x\xF1j\e\"\xE41Bu_\x16J\xE4M\x7F\xC5U[\xB9\xD0\xC7\xECu\xE53\xB4)\xD5\x80|\xB7.\xD2\f\xF3\x16\x8B\xE3\x13\x81\x02:5\x88\x0F

应映射到: [1073741917、13798400、0、2.4178516392292583e+24、5.851859700165677e+25]

最佳答案

试试这个:

package main

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

type UnpackedThing struct {
    First  uint32
    Second uint32
    Third  uint32

    Fourth float32
    Fifth  float32
}

func main() {
    input := bytes.NewBufferString("]\x00\x00@\x00\x8C\xD2\x00\x00\x00\x00\x00\x00\x00\x00h.\x9FAjK\x8FG\xC0T\x87UX\xA1CH\xB7\x80\x82}\xBB\xF9\x8F\xBAcqF{\xE31/Zx\xC0\x04\xFF\b\xA0\xBD\a\x9E\x0F\x14c+\b\xD3\xE8\xE1\xC2\x1C7\xBCmd/j\xC1H\x191~\x91F\b5-\x8A\x9F(\\\xF1\x16/\x0F\xEA\xD9\x94rV\xEC\xBB\xCB\x12qJ\x05\b\x04 {R\xB8\xA4\xA9\xD0)v\x97<\xCA\x92\xB6U\b)\x1D\x1D\xF1\x00\xE4U\x8DB\x16/v\xEC[bLTW\xB2\xFB\x0F\x91\x05\xAA\x9C\xBD\x8E\x1A\xFB\xDFUJ\xB8\xDE\xF5m\xC8Z\xC1\v\\|\r;\xB6\xE6\xA6\x13o\x91\xE1\xBA\x9An\x8B\x01W\xB9\"\x12+\x9B[\xC7\xCD\xC2O+\f^|\xE1G\x86.%m\xB2x\xF1j\x1B\"\xE41Bu_\x16J\xE4M\x7F\xC5U[\xB9\xD0\xC7\xECu\xE53\xB4)\xD5\x80|\xB7.\xD2\f\xF3\x16\x8B\xE3\x13\x81\x02:5\x88\x0F")
    var unpacked UnpackedThing

    err := binary.Read(input, binary.LittleEndian, &unpacked)
    if err != nil {
        log.Fatal(err)
    }

    log.Printf("[%d, %d, %d, %f, %f]\n",
        unpacked.First, unpacked.Second, unpacked.Third, unpacked.Fourth, unpacked.Fifth)
}

我们正在创建一个正确表示二进制格式的结构,然后使用binary.Read()将字节读入该结构。需要注意的一点是golang的字符串不理解\e,所以必须将其转换为\x1b

输出:

*@x~/go/src/stackoverflow.com/binunpack⦕ go run main.go
2018/10/07 17:39:16 [1073741917, 13798400, 0, 2417851639229258349412352.000000, 58518597001656773736660992.000000]
*@x~/go/src/stackoverflow.com/binunpack⦕

关于Golang 中的字符串解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52692804/

相关文章:

java - 如何防止CR/LF?

sql - 将非结构化 JSON BYTEA 扫描到 map[string]string

android - 使用没有 mediaextractor 的 mediacodec 的 MP3 解码失败

Apache 代理导致 ERR_CONTENT_DECODING_FAILED 错误

c# - 在 byte[] 中查找 byte[] 并在字符串中查找字符串的速度 - 为什么后者更快?

我可以将字符串传递给函数吗

java - Scala RegEx 字符串提取器的行为不一致

c - 调用Windows API函数(stdcall)的符号扩展规则是什么?这是从 Go 调用 WInAPI 所必需的,它对 int 类型很严格

testing - 如何修复 Go 测试输出中的行号?

delphi - 使用delphi 2007对base64进行编码和解码base64