2014-04-23 4 views
2

16 진수를 나타내는 문자열을 읽고 바이트 조각 ([]string --> [][]byte)의 조각으로 디코드하고 싶습니다.이동 : 딥 복사 조각

i = 0 tmp = 010203 
i = 1 tmp = 040506 
i = 3 tmp = 070809 
line 69 data[0] =  data[1] =  data[2] = 070809 

는 아마도 함수가 [][]byte{[]byte{}, []byte{}, []byte{0x07, 0x08, 0x09}}를 반환 args = []string{"010203","040506","070809"} 다음과 같은 출력을 얻을 수

func (self *algo_t) decode_args(args []string) ([][]byte, error) { 
    var data [][]byte 
    for i := uint32(0); i < self.num_args; i++ { 
     data = make([][]byte, self.num_args) 
     tmp, err := hex.DecodeString(args[i]) 
     fmt.Printf("i = %d\ttmp = %x\n", i, tmp) 
     data[i] = make([]byte, len(tmp)) 
     copy(data[i], tmp) 
     if err != nil { 
      fmt.Fprintf(os.Stderr, "Error decoding hex string %s: %s\n", args[i], err.Error()) 
      return nil, err 
     } 
    } 
    fmt.Printf("line 69\tdata[0] = %x\tdata[1] = %x\tdata[2] = %x\n",data[0], data[1], data[2]) 
    return data, nil 
} 

이 코드를 호출하고 전달이 지금까지 내 코드입니다.

나는 이것이 Go의 포인터 동작 때문이라는 것을 알고 있습니다. 이런 종류의 사본을 작성하는 가장 좋은 방법은 무엇입니까? http://godoc.org/code.google.com/p/rog-go/exp/deepcopy

당신은 여기에 소스를 볼 수 있습니다 : https://code.google.com/p/rog-go/source/browse/exp/deepcopy/deepcopy.go

+0

; 오류는 실제로 4 행에 있습니다. make() 명령은 for 루프 외부로 이동해야합니다. 나는 그것을했고, 모든 것이 잘 작동한다. – ILikeFood

답변

2

,

package main 

import (
    "encoding/hex" 
    "fmt" 
) 

// Decode hex []string to [][]byte 
func decode(s []string) ([][]byte, error) { 
    b := make([][]byte, len(s)) 
    for i, ss := range s { 
     h, err := hex.DecodeString(ss) 
     if err != nil { 
      err = fmt.Errorf(
       "Error decoding hex string %s: %s\n", 
       ss, err.Error(), 
      ) 
      return nil, err 
     } 
     b[i] = h 
    } 
    return b, nil 
} 

func main() { 
    s := []string{"010203", "040506", "070809"} 
    fmt.Println(s) 
    b, err := decode(s) 
    if err != nil { 
     fmt.Println(err) 
    } else { 
     fmt.Println(b) 
    } 
    s = []string{"ABCDEF", "", "09AF"} 
    fmt.Println(s) 
    b, err = decode(s) 
    if err != nil { 
     fmt.Println(err) 
    } else { 
     fmt.Println(b) 
    } 
    s = []string{"01", "123XYZ"} 
    fmt.Println(s) 
    b, err = decode(s) 
    if err != nil { 
     fmt.Println(err) 
    } else { 
     fmt.Println(b) 
    } 
} 

출력 :

관용구는이 작업을 수행하기 위해 허용되는 방법은 마치
[010203 040506 070809] 
[[1 2 3] [4 5 6] [7 8 9]] 
[ABCDEFAF] 
[[171 205 239] [1 35 69] [9 175]] 
[01 123XYZ] 
Error decoding hex string 123XYZ: encoding/hex: invalid byte: U+0058 'X' 
+0

답장을 보내 주셔서 감사합니다. 내 코드를 내 코드와 비교하여 오류를 발견했습니다. 실제로 루프 내에서 make() 명령어를 배치하여 반복 할 때마다 새로운 배열을 할당했습니다. +1 작업 예제, 그리고 받아 들였다. – ILikeFood

0

깊은 사본을 처리하기 위해 특별히 만들어진 패키지가있다. 그것은 슬라이스와 포인터를 복사하는 것을 다루기 때문에 여러분의 경우를 다루어야합니다. 예를 들어