바이트 배열에 문자열을 할당하는 방법
바이트 배열에 문자열을 할당하고 싶습니다.
var arr [20]byte
str := "abc"
for k, v := range []byte(str) {
arr[k] = byte(v)
}
다른 방법이 있습니까?
안전하고 간단합니다.
[]byte("Here is a string....")
문자열에서 바이트 슬라이스로 변환하려면 string -> []byte
다음을 수행하십시오.
[]byte(str)
배열을 슬라이스로 변환하려면 [20]byte -> []byte
다음을 수행하십시오.
arr[:]
문자열을 배열에 복사하려면 string -> [20]byte
:
copy(arr[:], str)
위와 동일하지만 먼저 문자열을 슬라이스로 명시 적으로 변환합니다.
copy(arr[:], []byte(str))
- 내장
copy
기능 은 슬라이스 에서 슬라이스 로만 복사 합니다 . - 배열은 "기본 데이터"이고 슬라이스는 "기본 데이터의 뷰포트"입니다.
- 를 사용
[:]
하면 배열을 슬라이스로 사용할 수 있습니다. - 문자열을 복사 할 수있는 슬라이스로 인정하지 않습니다 에 ,하지만 복사 할 수있는 슬라이스 자격 에서 (문자열은 불변).
- 문자열이 너무 길면,
copy
맞는 문자열 부분 만 복사합니다.
이 코드는 :
var arr [20]byte
copy(arr[:], "abc")
fmt.Printf("array: %v (%T)\n", arr, arr)
... 다음 출력을 제공합니다.
array: [97 98 99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] ([20]uint8)
Go Playground 에서도 이용할 수있었습니다
예를 들어
package main
import "fmt"
func main() {
s := "abc"
var a [20]byte
copy(a[:], s)
fmt.Println("s:", []byte(s), "a:", a)
}
산출:
s: [97 98 99] a: [97 98 99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
케이크 조각 :
arr := []byte("That's all folks!!")
더 낫다고 생각합니다 ..
package main
import "fmt"
func main() {
str := "abc"
mySlice := []byte(str)
fmt.Printf("%v -> '%s'",mySlice,mySlice )
}
여기를 확인하십시오 : http://play.golang.org/p/vpnAWHZZk7
문자열을 바이트 슬라이스로 변환
[] 문자열을 [] 바이트 유형으로 변환하는 빠른 방법이 필요합니다. 텍스트 데이터를 랜덤 액세스 파일 또는 입력 데이터가 [] 바이트 유형이어야하는 다른 유형의 데이터 조작에 저장하는 등의 상황에서 사용합니다.
package main
func main() {
var s string
//...
b := []byte(s)
//...
}
바이트 슬라이스를 데이터 매개 변수로 허용하는 ioutil.WriteFile을 사용할 때 유용합니다.
WriteFile func(filename string, data []byte, perm os.FileMode) error
또 다른 예
package main
import (
"fmt"
"strings"
)
func main() {
stringSlice := []string{"hello", "world"}
stringByte := strings.Join(stringSlice, " ")
// Byte array value
fmt.Println([]byte(stringByte))
// Corresponding string value
fmt.Println(string([]byte(stringByte)))
}
산출:
[104 101108108111 32119111114108100] 안녕하세요 세계
링크 놀이터를 확인하십시오
이를 위해 배열 특정 메소드를 작성했습니다. 각 int 유형에 대한 특정 메소드가 있는 인코딩 / 이진 패키지와 매우 유사합니다 . 예를 들어 binary.BigEndian.PutUint16([]byte, uint16)
.
func byte16PutString(s string) [16]byte {
var a [16]byte
if len(s) > 16 {
copy(a[:], s)
} else {
copy(a[16-len(s):], s)
}
return a
}
var b [16]byte
b = byte16PutString("abc")
fmt.Printf("%v\n", b)
산출:
[0 0 0 0 0 0 0 0 0 0 0 0 0 97 98 99]
오른쪽이 아닌 왼쪽에 어떻게 패딩을 원했는지 확인하십시오.
http://play.golang.org/p/7tNumnJaiN
위에서 언급 한 방법 외에도 다음과 같은 트릭을 수행 할 수 있습니다
s := "hello"
b := *(*[]byte)(unsafe.Pointer((*reflect.SliceHeader)(unsafe.Pointer(&s))))
플레이 : http://play.golang.org/p/xASsiSpQmC
이것을 사용해서는 안됩니다 :-)
배열은 값입니다 ... 슬라이스는 포인터와 비슷합니다. 즉이 [n]type
와 호환되지 않습니다 []type
그들이 근본적으로 다른 두 가지이기 때문에. 스토리지를 백업 arr[:]
하는 슬라이스를 반환하는를 사용하여 배열을 가리키는 슬라이스를 얻을 수 있습니다 arr
.
예 []byte
를 들어 슬라이스를 변환하는 한 가지 방법 [20]byte
은 (값이 필요 하지 않으므로 ) [20]byte
사용하여 수행 할 수 있는 것을 실제로 할당 한 다음 데이터를 복사하는 것입니다.var [20]byte
make
buf := make([]byte, 10)
var arr [10]byte
copy(arr[:], buf)
본질적으로 다른 많은 답변이 잘못 []type
되면 배열이 아닙니다.
[n]T
와 []T
완전히 다른 것입니다!
리플렉션을 사용할 때는 []T
Array가 아닌 Slice와 [n]T
Array가됩니다.
또한 사용할 수는 없지만 사용할 map[[]byte]T
수 있습니다 map[[n]byte]T
.
예를 들어 많은 함수가 작동하는 []byte
반면 일부 함수는 [n]byte
(대부분 해시 함수 crypto/*
)를 반환 하기 때문에 때로는 성 가실 수 있습니다 . 예를 들어 sha256 해시는 초보자가 파일에 쓰려고 할 때 [32]byte
그렇지 않습니다 []byte
.
sum := sha256.Sum256(data)
w.Write(sum)
그들은 오류가 발생합니다. 올바른 방법은 사용하는 것입니다
w.Write(sum[:])
그러나 원하는 것이 무엇입니까? 바이트 단위로 문자열에 액세스합니까? 다음 string
을 []byte
사용하여 a 를 쉽게 변환 할 수 있습니다 .
bytes := []byte(str)
그러나 이것은 배열이 아니며 슬라이스입니다. 또한 byte
! = rune
입니다. "문자"로 작업하려면 rune
... not 을 사용해야 byte
합니다.
참고 URL : https://stackoverflow.com/questions/8032170/how-to-assign-string-to-bytes-array
'Programing' 카테고리의 다른 글
자식 추적에서 폴더 제거 (0) | 2020.03.03 |
---|---|
Git Extensions : Win32 오류 487 : Cygwin의 힙을위한 공간을 예약 할 수 없음, Win32 오류 0 (0) | 2020.03.03 |
누군가가 iPhone을 흔들면 어떻게 감지합니까? (0) | 2020.03.03 |
여분의 공간이있는 여러 줄 문자열 (보존 들여 쓰기) (0) | 2020.03.03 |
클래스별로 요소를 찾는 방법 (0) | 2020.03.03 |