微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将具有零值的 []byte 转换为 Go 中的字符串?

如何解决如何将具有零值的 []byte 转换为 Go 中的字符串?

我知道已经有这样的问题:How do I convert [Size]byte to string in Go?,但我的问题是“如何将 []byte WITH ZERO VALUES 转换为字符串”

package main

import (
    "fmt"
    "strings"
)

func main() {
    a := make([]byte,16)

    r := strings.NewReader("test")
    _,_ = r.Read(a)

    b := "test"

    fmt.Println(string(a),b)
    fmt.Println(string(a) == b)
    fmt.Println(len(string(a)),len(b))
    fmt.Println(a,[]byte(b))
}

上面的代码打印:

test test
false
16 4
[116 101 115 116 0 0 0 0 0 0 0 0 0 0 0 0] [116 101 115 116]

正如您所见,a 中的零值导致了 ab间的不等式,我应该如何对待它们?如何正确比较两者?

解决方法

当您声明切片 a 时:

a := make([]byte,16)

所有元素都使用 byte 的“零值”初始化,即 0

出于所有意图和目的,您可以考虑切片已满。您可以完全或部分覆盖它,但它始终是一个 16 个元素的切片,每个索引都有一个值。

如果你想从切片的末尾修剪零值,你可以这样做:

func trim(a []byte) []byte {
  for i := len(a) - 1; i >= 0; i-- {
    if a[i] != 0 {
      // found the first non-zero byte
      // return the slice from start to the index of the first non-zero byte
      return a[:i+1]
    }
  }

  // didn't find any non-zero bytes just return an empty slice
  return []byte{}
}

然后比较:

string(trim(a)) == b
,

Read 返回的长度有助于对数组进行切片:

a := make([]byte,16)

r := strings.NewReader("test")
l,_ = r.Read(a)

b := "test"

fmt.Println(string(a[:l]) == b)) // true,they are equal!

谢谢@torek

,

您可以在获得阅读器后声明您的切片“a”。然后就可以调用r.Size()方法获取切片所需的长度。

import (
    "fmt"
    "strings"
)

func main() {

    r := strings.NewReader("test")
    a := make([]byte,r.Size())
    _,_ = r.Read(a)

    b := "test"

    fmt.Println(string(a),b) // test test
    fmt.Println(string(a) == b) //true
    fmt.Println(len(string(a)),len(b)) //4 4
    fmt.Println(a,[]byte(b)) //[116 101 115 116] [116 101 115 116]
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?