2016-09-06 3 views
1

Ich arbeite mit einem HID-Treiber, und dieser Treiber liest auf einen []byte Puffer einen von ein paar verschiedenen Berichten. Wenn ich hex.EncodeToString(buffer) benutze, gibt es eine Zeichenkette zurück, die wie 0000 oder 0100 oder 0200, etc. aussieht. Ich möchte mit einem Schalter gegen die Eingabe vom HID Gerät überprüfen, und deshalb möchte ich diese Möglichkeiten vordefinieren main(), wie soll ich fortfahren?Definieren Sie ein [] Byte ohne hex.DecodeString

Ich habe diese Möglichkeiten versucht:

var LEFT []byte = []byte('0000') 
// or 
var LEFT []byte = `0000` 
// or 
var LEFT []byte = '0000' 
// or 
var LEFT []byte = '\x00\x00' // from the %q Printf verb 

Die Alternative ist, dass ich hex.DecodeString("0000") innerhalb der main() Funktion aufrufen.

bearbeiten

Ein Hinweis auf die Lösung angeboten, die EncodeToString hex 0000 oder 0100 ist nicht vier Bytes, sondern zwei:

"\x01" == == "01"'1'

so kann ich verwenden, um 0100 oder 0200 zu bekommen, wie vorgeschlagen:

var LEFT []byte{1,0} 
// or 
var LEFT []byte("\x01\x00") 
+0

_ „... aber dies beinhaltet Fehlerprüfung, und ich hatte gehofft, sie beiseite zu setzen.“ _ Wenn Sie in Go arbeiten/Programm wollen, gewöhnen Überprüfung auf Fehler. Sonst wirst du dein (Go) Leben miserabel machen ... – icza

+0

Oh, und ich liebe die Fehlerprüfung, ich meinte, ich wollte nicht nach einem DecodeString suchen, für den ich sicher war, dass Ich wollte das [] Byte vor dem Kompilieren definieren, mit einem Wert, von dem ich mir bereits sicher war, dass er mir keinen Fehler geben würde. – Nevermore

+1

Wenn Sie wissen, dass es nicht fehlschlägt, können Sie eine 'MustDecode()' Hilfsfunktion bereitstellen. Details finden Sie in der Antwort [Gehe zu: Mehrfachwert in einem einwertigen Kontext] (http://stackoverflow.com/a/28233172/1705598). – icza

Antwort

2

Verwenden Sie die folgenden Schritte aus:

var (
    left = []byte{0, 0} 
    right = []byte{1, 0} 
    // ... and so on 
) 

Wenn Sie es auf hex schreiben wollen:

var (
    left = []byte{0x00, 0x00} 
    right = []byte{0x01, 0x00} 
    // ... and so on 
) 

Sie auch einen String in einen [] Byte umwandeln kann:

var (
    left = []byte("\x00\x00") 
    right = []byte("\x01\x00") 
) 

Verwenden Sie diese Variablen in einer switch-Anweisung wie dieser:

switch { 
case bytes.Equal(v, left): 
    fmt.Println("left") 
case bytes.Equal(v, right): 
    fmt.Println("right" 
} 

Es sieht aus wie Sie mit 2-Byte-Zahlen codiert in Little-Endian-Format arbeiten. Wenn ja, können Sie decode the bytes to an integer:

const (
    left = 0 
    right = 1 
) 

switch binary.LittleEndian.Uint16(byteSlice) { 
case left: 
    fmt.Println("left") 
case right: 
    fmt.Println("right") 
} 
1

definieren []byte einfachste und empfohlen mit einem Composite literal zu tun, wie Mellow Marmot vorgeschlagen. Beachten Sie, dass das zusammengesetzte Literal auch den Vorteil hat, dass Sie optionale Indizes im Literal verwenden können. Werte für "fehlende" Indizes sind der Nullwert des Elementtyps (0 im Fall byte). Und auch wenn Sie eine []byte voller Nullen benötigen, müssen Sie nicht die Elemente auflisten, Sie können nur make eine "leere" Scheibe.

So zum Beispiel können Sie auch Ihre Scheiben wie folgt erstellen:

var (
    left = make([]byte, 2) // will be [0, 0] 
    right = []byte{1: 1} // will be [0, 1] 
) 

func main() { 
    fmt.Println(left, right) 
} 

Output (versuchen Sie es auf dem Go Playground):

[0 0] [0 1] 

auch wissen, dass string Werte können direkt in []byte umgewandelt werden Daraus ergibt sich die Bytefolge der UTF-8 codierten Bytes der string (so speichert Go Strings im Speicher).

Wenn Sie also ein string Literal angeben können, das die UTF-8-codierte Bytefolge hat, die Sie benötigen, können Sie einfach convert es zu []byte. Und string literals da interpretiert können Escape-Sequenzen enthalten, ist es einfacher, als Sie denken:

Die dreistellige Oktal (\ nnn) und zweistellige hexadezimale (\ xnn) entkommt stellen einzelne Bytes des resultierenden String ...

So können Sie auch Ihre Byte-Werte in einem string wie folgt codiert angeben:

// With octal escapes 
var (
    left = []byte("\000\000") 
    right = []byte("\001\000") 
) 

// With hexa escapes 
var (
    left2 = []byte("\x00\x00") 
    right2 = []byte("\x01\x00") 
) 

func main() { 
    fmt.Println(left, right) 
    fmt.Println(left2, right2) 
} 

Output (versuchen Sie es auf dem Go Playground):

[0 0] [1 0] 
[0 0] [1 0] 

Siehe Fragen:

GO explicit array initialization

Keyed items in golang array initialization

0

Sie können nicht mit [] Byte in switch weil Scheiben nicht vergleichbar sind , Saiten sind. So Nähte nur

const LEFT = `0000` 
Verwandte Themen