package vhd import ( "encoding/binary" "encoding/hex" "fmt" "os" "strings" "unicode/utf16" "unicode/utf8" ) // https://groups.google.com/forum/#!msg/golang-nuts/d0nF_k4dSx4/rPGgfXv6QCoJ func uuidgen() string { b := uuidgenBytes() return fmt.Sprintf("%x-%x-%x-%x-%x", b[0:4], b[4:6], b[6:8], b[8:10], b[10:]) } func fmtField(name, value string) { fmt.Printf("%-25s%s\n", name+":", value) } func uuidgenBytes() []byte { f, err := os.Open("/dev/urandom") check(err) b := make([]byte, 16) f.Read(b) return b } func check(e error) { if e != nil { panic(e) } } func hexs(a []byte) string { return "0x" + hex.EncodeToString(a[:]) } func uuid(a []byte) string { return fmt.Sprintf("%08x-%04x-%04x-%04x-%04x", a[:4], a[4:6], a[6:8], a[8:10], a[10:16]) } func uuidToBytes(uuid string) []byte { s := strings.Replace(uuid, "-", "", -1) h, err := hex.DecodeString(s) check(err) return h } /* utf16BytesToString converts UTF-16 encoded bytes, in big or little endian byte order, to a UTF-8 encoded string. http://stackoverflow.com/a/15794113 */ func utf16BytesToString(b []byte, o binary.ByteOrder) string { utf := make([]uint16, (len(b)+(2-1))/2) for i := 0; i+(2-1) < len(b); i += 2 { utf[i/2] = o.Uint16(b[i:]) } if len(b)/2 < len(utf) { utf[len(utf)-1] = utf8.RuneError } return string(utf16.Decode(utf)) }