gpt4 book ai didi

algorithm - 如何在golang中实现可变字节编码算法

转载 作者:IT王子 更新时间:2023-10-29 02:32:17 24 4
gpt4 key购买 nike

我正在做一些整数压缩方面的工作。
我已经在 C++ 中实现了可变字节编码算法(参见下面的代码片段)。

我想知道如何在 golang 中实现它,因为我无法转换 stringtuneint 之间键入内存,就像 memcpy() 一样。

然后,我想通了 encoding/binary 包中的 binary.Write() 可以做序列化工作,可以将 uint8 编码为一个字节,将 unint16 编码为一个字节2个字节,uint32 4种类型等等。

但是如何仅使用 3 个字节对介于 2097152 和 268435456 之间的整数进行编码?

有没有类似snippet的转换方法?

void encode(int value, char* code_list, int& len) {

int bit_value = 0;
int bit_num = 0;

if (value < 128) {
bit_num = 1;
} else if (value < 16384) {
bit_num = 2;
bit_value = 1;
} else if (value < 2097152) {
bit_num = 3;
bit_value = 3;
} else {
bit_num = 4;
bit_value = 7;
}
value <<= bit_num;
value += bit_value;
memcpy(code_list + len, (char*) &value, bit_num);
len += bit_num;

}

最佳答案

您的编码是这样的,即第一个字节中最低有效 1 位的计数告诉您编码值有多少字节。

这是您代码的 Go 实现,它避免了字节顺序(您的 C 版本会这样做),并使用 io.Writer 而不是 memcpy 之类的东西。

查看它在以下位置运行:https://play.golang.org/p/jr0NypSnlW

package main

import (
"fmt"
"bytes"
"io"
)

func encode(w io.Writer, n uint64) error {
bytes := 0
switch {
case n < 128:
bytes = 1
n = (n << 1)
case n < 16834:
bytes = 2
n = (n << 2) | 1
case n < 2097152:
bytes = 3
n = (n << 3) | 3
default:
bytes = 4
n = (n << 4) | 7
}
d := [4]byte{
byte(n), byte(n>>8), byte(n>>16), byte(n>>24),
}
_, err := w.Write(d[:bytes])
return err
}

func main() {
xs := []uint64{0, 32, 20003, 60006, 300009}
var b bytes.Buffer
for _, x := range xs {
if err := encode(&b, x); err != nil {
panic(err)
}
}
fmt.Println(b.Bytes())
}

关于algorithm - 如何在golang中实现可变字节编码算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46046491/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com