为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
倚天杖 2022-10-04 19:38:06
我想使用ASCII编码在Go中对字符串进行编码,如下所示的C#函数:public static byte[] StrToByteArray(string str)        {            System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();            return encoding.GetBytes(str);        }我知道如何使用下面的功能来做到这一点: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))}目前,它被硬编码为25的长度。如何根据字符串的大小调整长度?
查看完整描述

2 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

阿西伊85.最大编码Len() 返回给定输入字节数的最大输出字节数。您可以使用此上限估计值。

返回实际使用/写入的字节数 ascii85。编码()。如果将更大的切片传递给 ,则必须使用它来对目标切片进行切片,超出此范围的字节是“垃圾”。Encode()

阿西伊85也是如此。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))

哪些输出:


87cURD_*#MCghU%Ec6)<A,

Hello, playground


查看完整回答
反对 回复 2022-10-04
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

系统.文本.ASCII编码和编码/ascii85包执行不同的操作。系统.文本.ASCII 编码通过将 ASCII 范围之外的字符替换为 。编码/ascii85 包将二进制数据编码为 ascii85,也称为 base85。?

以下 Go 函数复制了问题中的 C# 函数:

func StrToByteArray(str string) []byte {

    var result []byte

    for _, r := range str {

        if r >= utf8.RuneSelf {

            r = '?'

        }

        result = append(result, byte(r))

    }

    return result

}

如果您知道字符串仅包含 ASCII 字符,则转换将起作用:


func StrToByteArray(str string) []byte { return []byte(str) }


查看完整回答
反对 回复 2022-10-04
  • 2 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信