簡體   English   中英

Xamarin&Golang-{[]}無效字符'\\ x00'尋找對象密鑰字符串的開頭

[英]Xamarin & Golang - { []} invalid character '\x00' looking for beginning of object key string

我今天要來是因為我被卡住了,這對我來說似乎不合邏輯。

我有我的服務器( Go )和我的智能手機應用程序( Xamarin C# )。

對於Xamarin,我正在使用此程序包-> Xamarin和Windows(PCL)的套接字插件

對於Go端,我正在使用encoding / json

Xamarin部分的所有功能都正常運行。 但是在Go方面,它沒有..我正在使用以下代碼來處理來自每個net.Conn的消息。

type DialMessageContainer struct {
    Type string `json:"Type"`
    Content json.RawMessage `json:"Content"`
}

func (dialTCP *DialTCP) serve_conn(conn net.Conn) {

    fmt.Println("Handle new connection.")
    dec := json.NewDecoder(conn)
    var message m.DialMessageContainer

    //Use one of the following
    printContent(conn)                                                                                                                                                                                 
    // --
    err := dec.Decode(&message)
    fmt.Println(message, err)
    //End

    conn.Close()
}

func printContent(conn net.Conn) {
    var buf bytes.Buffer
    io.Copy(&buf, conn)
    fmt.Println(buf.String())
}

因此,這里的類型是讓它知道它是哪種json類型。 然后,從該類型字符串中將json.RawmMessage內容中的json解組到好的對象。 我知道它有效,但是當我嘗試從以下json重新創建對象時,出現此錯誤:

(printContent沒有注釋,然后Decode沒有任何內容可供讀取,用於調試跟蹤測試)

....
Handle new connection.
{
  "Type": "Authentication",
  "Content": {
    "UUID": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im1heGltZS1ndWl0dGV0QG91dGxvb2suY29tIiwiZXhwIjoxNDYyNjM4MTkzfQ.DEGJcDYl9Iq4nayo37Rq9ZsK8mrU-V8gU5I8JLO8oLg"
  }
}
{ []} EOF

因此, 當我隱藏printContent(conn)時 ,dec.Decode給出了這一點:

....
Handle new connection.
{ []} invalid character '\x00' looking for beginning of object key string

我對自己問的是:“ \\ x00是否表示ascii表的NULL CHAR?”。 如果此錯誤是由於此字符而引起的,那么它在哪里呢? 而且,如果是此char,則可能只是為了標記字符串的結束點而存在(在C中使用'\\ 0'來標記char * / char []的結束)。

但是,也許我完全錯了。.老實說,我被卡住了,我聽不懂.. Aynway, JSONLint說這是有效的JSON,所以只能是我認為的閱讀內容

如果有人可以幫助,謝謝!

您的printConn讀取消息,然后dec.Decode(&message)沒什么dec.Decode(&message)

我發現了問題所在...

要在服務器/客戶端之間交換消息,我使用JSON形式。


服務器Go中制作,並使用encoding/json包。

客戶端C#中Xamarin表單應用程序,並使用Newtonsoft.json包。


JSON序列化后,將采用字符串形式。 但是,要在客戶端/服務器之間進行寫入/讀取,必須將其格式化為字節( C# byte[] && Go []byte ),因此我們必須將jsonString轉換為bytes數組。

用我的Pseudo Emixam23看一下這種轉換:

// C#
Emixam23 == [69][0][109][0][105][0][120][0][97][0][109][0][50][0][51][0]

// Go
Emixam23 == [69][109][105][120][97][109][50][51]

這兩個數組代表我們的字符串Emixam23的字節數組,但是它們是不同的。 如您所見,與Go部分不同,C#部分具有[0] [0]是左邊字節的符號

等於0的字節表示'\\0' ,然后是C語言的字符串的結尾。我認為Go的工作原理相同。 如果我是對的,那么錯誤就是邏輯,當json.Decode() //go遍歷我的字節數組時,它會到達結尾'\\0' 因此,解碼會在字節數組的第二種情況下停止運行,並嘗試使用此字符串"{"創建一個JSON,這是無效的JSON。

當然,對於C#部分也是如此。 然后,我創建了這兩個函數,它們對字節數組進行sign()unsign()

// for both, bytes[] is the byte array you want to convert and
// the lenght of this byte array when you call the function
public byte[] UnsignByteArray(byte[] bytes, int lenght)
    {
        int index = 0;
        int i = 0;
        var array = new byte[lenght / 2];

        while (index < lenght)
        {
            array[i] = bytes[index];
            index += 2;
            i++;
        }

        return array;
    }
public byte[] SignByteArray(byte[] bytes, int lenght)
    {
        int index = 0;
        int i = 0;
        var array = new byte[lenght * 2];

        while (index < lenght)
        {
            array[i] = bytes[index];
            i++;
            index++;
            array[i] = 0;
            i++;
        }

        return array;
    }

永遠不要忘記調試/打印雙方的每個數據,它會有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM