在不同长度的字符串上将字符串编码为其 ASCII 表示形式

Bla*_*man 1 go

我想使用 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。如何根据字符串的大小调整长度?

icz*_*cza 5

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)