2010-01-29 3 views
2

큰 숫자를 바이트 목록 (이동의 uint8)으로 인코딩하려고합니다. 바이트 수를 알 수 없으므로 벡터를 사용하고 싶습니다. 하지만 Go는 바이트의 벡터를 제공하지 않습니다. 어떻게해야합니까? 그런 바이트 벡터 조각을 얻을 수 있습니까?Go를 사용하면 알 수없는 바이트 수를 벡터에 추가하고 바이트 조각을 얻는 방법은 무엇입니까?

데이터 압축을 구현하려고합니다. 작은 숫자와 큰 숫자를 같은 수의 바이트로 저장하는 대신 작은 숫자 ( )와 적은 바이트를 사용하는 변수 바이트를 구현하고 많은 수의 바이트를 사용합니다.

1 package main 
    2 
    3 import (
    4  //"fmt" 
    5  "container/vector" 
    6) 
    7 
    8 func vbEncodeNumber(n uint) []byte{ 
    9  bytes := new(vector.Vector) 
10  for { 
11   bytes.Push(n % 128) 
12   if n < 128 { 
13    break 
14   } 
15   n /= 128 
16  } 
17  bytes.Set(bytes.Len()-1, bytes.Last().(byte)+byte(128)) 
18  return bytes.Data().([]byte) // <- 
19 } 
20 
21 func main() { vbEncodeNumber(10000) } 

내가 그래서 난 바이트 배열을 반환 할 수 FUNC 소원에 바이너리 파일에 같은 코드를 많이 기록 할 :

내 코드는 유효하지 않은 유형의 주장을 컴파일 할 수 없습니다.

벡터에서 코드 예제를 찾지 못했습니다.

+0

는 사실, 나는 내 요구를 충족하는 기능을 bytes.Add 사용할 수 있습니다 찾을 수 있습니다. 벡터를 전혀 사용할 필요가 없습니다. –

답변

2

큰 숫자를 나타 내기 때문에 큰 패키지가 용도에 맞는지 확인할 수 있습니다.

일반 Vector 구조체를 사용하여 바이트를 저장할 수 있습니다. 빈 인터페이스를 유형으로 받아들이고 다른 유형은 해당 인터페이스를 충족시킵니다. Data 메서드를 통해 인터페이스 조각을 검색 할 수 있지만이를 복사하지 않고 바이트 조각으로 변환 할 방법이 없습니다. 타입 어설 션을 사용하여 인터페이스 {}의 슬라이스를 다른 슬라이스로 바꿀 수 없습니다. 당신은 함수의 끝에 다음과 같은 일을해야 할 것 :

byteSlice = make([]byte, bytes.Len()) 
for i, _ := range byteSlice { 
    byteSlice[i] = bytes.At(i).(byte) 
} 
return byteSlice 
2

바이트 패키지를 살펴보고 (내가 지금 할 수 없기 때문에이 코드를 컴파일 시도하지 않은)이 거기에 버퍼 유형. int를 버퍼로 쓸 수 있고 Bytes() 메서드를 사용하여 버퍼의 바이트 슬라이스에 액세스 할 수 있습니다.

1

일반 추가 및 복사가 언어에 추가 되었기 때문에 벡터가 훨씬 덜 유용하다는 것을 알았습니다. 여기에 내가 덜 복사로 한 번에 그것을 할 거라고 방법은 다음과 같습니다

package main 

import "fmt" 

func vbEncodeNumber(n uint) []byte { 
    bytes := make([]byte, 0, 4) 
    for n > 0 { 
     bytes = append(bytes, byte(n%256)) 
     n >>= 8 
    } 
    return bytes 
} 

func main() { 
    bytes := vbEncodeNumber(10000) 
    for i := len(bytes)-1; i >= 0 ; i-- { 
     fmt.Printf("%02x ", bytes[i]) 
    } 
    fmt.Println("") 
} 
관련 문제