537

[100]byte大量のデータを転送するために読み取る必要がありstringます。

すべてstringの が正確に 100 文字の長さであるとは限らないため、残りの部分はbyte arrayで埋められ0ます。

by:に変換する[100]byteと、末尾の s が s として表示されます。stringstring(byteArray[:])0^@^@

C では、stringwill は で終了しますが0、これbyte arraystringGo に変換する最良の方法は何ですか?

4

11 に答える 11

546

データをバイト スライスに読み取るメソッドは、読み取ったバイト数を返します。その番号を保存してから、それを使用して文字列を作成する必要があります。が読み取られたバイト数の場合n、コードは次のようになります。

s := string(byteArray[:n])

完全な文字列を変換するには、これを使用できます。

s := string(byteArray[:len(byteArray)])

これは次と同等です。

s := string(byteArray[:])

何らかの理由でわからない場合は、入力に null 文字が埋め込まれていないと仮定して、パッケージをn使用して見つけることができます。bytes

n := bytes.Index(byteArray[:], []byte{0})

または、icza が指摘したように、以下のコードを使用できます。

n := bytes.IndexByte(byteArray[:], 0)
于 2013-01-09T07:24:38.720 に答える
375

使用する:

s := string(byteArray[:])
于 2013-09-04T13:52:33.707 に答える
7

次のコードは '\0' を探しています。質問の仮定の下では、すべての非'\0' がすべての '\0' に先行するため、配列はソートされていると見なすことができます。配列がデータ内に '\0' を含むことができる場合、この仮定は成立しません。

二分探索を使用して最初のゼロバイトの位置を見つけてから、スライスします。

次のようにゼロバイトを見つけることができます。

package main

import "fmt"

func FirstZero(b []byte) int {
    min, max := 0, len(b)
    for {
        if min + 1 == max { return max }
        mid := (min + max) / 2
        if b[mid] == '\000' {
            max = mid
        } else {
            min = mid
        }
    }
    return len(b)
}
func main() {
    b := []byte{1, 2, 3, 0, 0, 0}
    fmt.Println(FirstZero(b))
}

特にほとんどの文字列が短い場合は、バイト配列を単純にスキャンしてゼロバイトを探すほうが速い場合があります。

于 2013-01-09T22:56:42.463 に答える
0

パフォーマンス チューニングにのみ使用します。

package main

import (
    "fmt"
    "reflect"
    "unsafe"
)

func BytesToString(b []byte) string {
    return *(*string)(unsafe.Pointer(&b))
}

func StringToBytes(s string) []byte {
    return *(*[]byte)(unsafe.Pointer(&s))
}

func main() {
    b := []byte{'b', 'y', 't', 'e'}
    s := BytesToString(b)
    fmt.Println(s)
    b = StringToBytes(s)
    fmt.Println(string(b))
}
于 2014-12-23T05:46:40.893 に答える
-1
  • 読み取りには、配列の代わりにスライスを使用します。たとえばio.Reader、配列ではなくスライスを受け入れます。

  • ゼロパディングの代わりにスライスを使用します。

例:

buf := make([]byte, 100)
n, err := myReader.Read(buf)
if n == 0 && err != nil {
    log.Fatal(err)
}

consume(buf[:n]) // consume() will see an exact (not padded) slice of read data
于 2013-01-09T07:33:15.360 に答える
-1

null バイトを削除するオプションは次のとおりです。

package main
import "golang.org/x/sys/windows"

func main() {
   b := []byte{'M', 'a', 'r', 'c', 'h', 0}
   s := windows.ByteSliceToString(b)
   println(s == "March")
}
于 2021-03-12T21:12:52.967 に答える