Parse Kafka.header to int in go lang

huangapple go评论81阅读模式
英文:

Parse Kafka.header to int in go lang

问题

我一直在尝试将 []kafka.Header 转换为 Go 中的 int。到目前为止,我已经尝试了几种方法。

其中一些方法包括:

  • 将字节数组转换为字符串,然后再转换为 int - string(header.Value)
  • 将第一个字节转换为字符串,然后再转换为 int - string(header.Value[0])
  • 将第一个字节转换为 int - int(header.Value[0])
  • 使用 strconv 将字节数组转换为 int - strconv.Atoi(string(header.Value))
  • 使用基数 10 和基数 16 的自定义函数进行解析

但是到目前为止,所有的方法都导致了错误或不正确的转换。

错误消息的快照:

  • 错误:strconv.Atoi: 解析 "\x01\x00\x00\x00" 时出错:无效的语法
  • 编码/十六进制:无效的字节:U+0001

输入的格式类似于这样(ASCII 中的单个十六进制字节)- headers: [requestNum="\x01\x00\x00\x00" retryNum="\x1c\x00\x00\x00" retryDelaySecs="@\x01\x00\x00"]

期望的输出是它们的 int 等价物,即 1、28、320。

请随时提供更多信息。
请帮助我解决这个问题,并提供任何建议。提前感谢。

英文:

I have been trying to convert []kafka.Header to int in Go. I have tried quite a few approaches so far.

A few of them are:

  • converting the byte array to string and then to int - string(header.Value)
  • converting the first byte to string and then to int - string(header.Value[0])
  • converting the first byte to int - int(header.Value[0])
  • converting the byte array to int using strconv - strconv.Atoi(string(header.Value))
  • custom function to parse by using the base 10 and base 16

But all the approaches so far have either resulted in an error or incorrect conversion.

Snapshot of error messages:

  • err: strconv.Atoi: parsing "\x01\x00\x00\x00": invalid syntax
  • encoding/hex: invalid byte: U+0001

The input is something like this (single hex bytes in ASCII) - headers: [requestNum="\x01\x00\x00\x00" retryNum="\x1c\x00\x00\x00" retryDelaySecs="@\x01\x00\x00"]

The expected output is their int equivalents i.e. 1, 28, 320

Feel free to ask for more info.
Please assist me with the same with any suggestions. Thanks in advance.

答案1

得分: 1

使用encoding/binary包来读取二进制数据。例如:

package main

import (
	"encoding/binary"
	"fmt"

	"github.com/confluentinc/confluent-kafka-go/kafka"
)

func main() {
	headers := []kafka.Header{
		{
			Key:   "requestNum",
			Value: []byte("\x01\x00\x00\x00"),
		},
		{
			Key:   "retryNum",
			Value: []byte("\x1c\x00\x00\x00"),
		},
		{
			Key:   "retryDelaySecs",
			Value: []byte("@\x01\x00\x00"),
		},
	}

	for _, h := range headers {
		v := binary.LittleEndian.Uint32(h.Value)
		fmt.Printf("%s: %d\n", h.Key, v)
	}
}
英文:

Use the encoding/binary package to read binary data. For example:

package main

import (
	"encoding/binary"
	"fmt"

	"github.com/confluentinc/confluent-kafka-go/kafka"
)

func main() {
	headers := []kafka.Header{
		{
			Key:   "requestNum",
			Value: []byte("\x01\x00\x00\x00"),
		},
		{
			Key:   "retryNum",
			Value: []byte("\x1c\x00\x00\x00"),
		},
		{
			Key:   "retryDelaySecs",
			Value: []byte("@\x01\x00\x00"),
		},
	}

	for _, h := range headers {
		v := binary.LittleEndian.Uint32(h.Value)
		fmt.Printf("%s: %d\n", h.Key, v)
	}
}

huangapple
  • 本文由 发表于 2022年11月16日 06:38:23
  • 转载请务必保留本文链接:https://go.coder-hub.com/74453031.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定