我想使用 ASCII 编码在 Go 中对字符串进行编码,就像下面的 C# 函数一样:
public static byte[] StrToByteArray(string str)
{
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
return encoding.GetBytes(str);
}
Run Code Online (Sandbox Code Playgroud)
我知道如何使用以下函数来做到这一点:
import (
"encoding/ascii85"
"fmt"
)
func main() {
dst := make([]byte, 25, 25)
dst2 := make([]byte, 25, 25)
ascii85.Encode(dst, []byte("Hello, playground"))
fmt.Println(dst)
ascii85.Decode(dst2, dst, false)
fmt.Println(string(dst2))
}
Run Code Online (Sandbox Code Playgroud)
目前它的长度被硬编码为 25。如何根据字符串的大小调整长度?
ascii85.MaxEncodedLen()返回给定输入字节数的最大输出字节数。您可以使用这个上限估计。
返回实际使用/写入的字节数ascii85.Encode()。如果您将更大的切片传递给Encode(),则必须使用它来对目标切片进行切片,超出此范围的字节是“垃圾”。
同样的情况ascii85.Decode():它返回写入的字节数,如果您传递了更大的切片,则必须使用它来对目标进行切片。
此外,由于解码可能会失败(无效输入),因此您还应该检查返回的错误。
此外,由于不能保证给定的输入将产生是所使用的 32 位块的倍数的输出,因此请传递flush=true以消耗给定的输入切片(而不是等待更多输入)。
最终更正后的代码:
s := []byte("Hello, playground")
maxlen := ascii85.MaxEncodedLen(len(s))
dst := make([]byte, maxlen)
n := ascii85.Encode(dst, s)
dst = dst[:n]
fmt.Println(string(dst))
dst2 := make([]byte, maxlen)
n, _, err := ascii85.Decode(dst2, dst, true)
if err != nil {
panic(err)
}
dst2 = dst2[:n]
fmt.Println(string(dst2))
Run Code Online (Sandbox Code Playgroud)
哪个输出(在Go Playground上尝试):
87cURD_*#MCghU%Ec6)<A,
Hello, playground
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
319 次 |
| 最近记录: |