栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何将[] int8转换为字符串

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何将[] int8转换为字符串

事先注意:
询问者首先指出输入分片就是

[]int8
答案。后来他意识到输入是
[]uint8
可以直接转换为的,
string
因为
byte
它是别名
uint8
(并且语言规范支持
[]byte
=>
string
转换)。


您无法转换不同类型的切片,必须手动进行。

问题是我们应该转换为哪种类型的切片?我们有2个候选人:

[]byte
[]rune
。字符串在内部(
[]byte
)作为UTF-8编码的字节序列存储,
string
也可以将a转换为一段符文。该语言支持将这两种类型(
[]byte
[]rune
)都转换为
string

A

rune
是一个Unipre代码点。如果我们尝试以一对一的方式将a 转换
int8
为a
rune
,那么如果输入包含编码为多个字节(使用UTF-8)的字符,则它将失败(表示错误的输出),因为在这种情况下,
int8
应使用多个值最终合而为一
rune

让我们从

"世界"
字节为以下的字符串开始:

fmt.Println([]byte("世界"))// Output: [228 184 150 231 149 140]

及其符文:

fmt.Println([]rune("世界"))// [19990 30028]

它只有2个符文和6个字节。因此,显然1对1-

int8
>
rune
映射将不起作用,我们必须使用1-1-
int8
>
byte
映射。

byte
uint8
具有range的别名,如果字节值> 127
0..255
,则必须将其转换为
[]int8
(具有range
-128..127
),
-256+bytevalue
因此
"世界"
string
in
[]int8
如下所示:

[-28 -72 -106 -25 -107 -116]

向后转换我们想要的是:

bytevalue = 256 + int8value
如果a
int8
为负,但我们不能将其转换为
int8
(range
-128..127),也不
byte
能将其转换为(range 0..255),因此我们还必须将其转换为
int
first(and
back)到
byte
最后)。可能看起来像这样:

if v < 0 {    b[i] = byte(256 + int(v))} else {    b[i] = byte(v)}

但是实际上,由于有符号整数是使用
2的补码表示的,因此,如果我们仅使用

byte(v)
转换(如果是负数,则等于
256+ v
),我们将得到相同的结果。

注意: 由于我们知道切片的长度,因此分配具有该长度的切片并仅使用索引设置其元素

[]
而不调用内置
append
函数要快得多。

所以这是最终的转换:

func B2S(bs []int8) string {    b := make([]byte, len(bs))    for i, v := range bs {        b[i] = byte(v)    }    return string(b)}

在Go Playground上尝试一下。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/447954.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号