亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

Go
米琪卡哇伊 2022-01-17 10:41:23
我今天來是因為我被困住了,這對我來說似乎不合邏輯。我有我的服務器 ( Go ) 和我的智能手機應用程序 ( Xamarin C# )。對于 Xamarin 方面,我正在使用這個包 -> Sockets Plugin for Xamarin and Windows (PCL)對于 Go 方面,我使用的是encoding/jsonXamarin 部分中的所有內容都運行良好。但在 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,所以它只能是我認為的閱讀內容如果有人可以幫忙,謝謝!
查看完整描述

2 回答

?
繁花如伊

TA貢獻2012條經驗 獲得超12個贊

printConn閱讀了消息,然后dec.Decode(&message)沒有可閱讀的內容。


查看完整回答
反對 回復 2022-01-17
?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

我發現是什么問題...


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


服務器正在使用Go并使用該encoding/json包。


客戶端是 C# 中的Xamarin表單應用程序并使用Newtonsoft.json包。


一旦 JSON 被序列化,它就會以字符串的形式出現。但是,要在客戶端/服務器之間寫入/讀取,必須將其格式化為字節(C#byte[] && Go[]byte),因此我們必須將其jsonString轉換為字節數組。


用我的 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的字節數組,但是,它們是不同的。如您所見,我們有一個[0]用于 C# 部分,與 Go 部分不同。這[0]是左邊字節的符號。


等于 0 的字節表示'\0'C 語言的字符串的結尾。我認為 Go 的工作方式相同。如果我是對的,那么錯誤就是邏輯,當json.Decode() //go迭代我的字節數組時,它會走到最后,即'\0'. 所以 decode 在我的字節數組的第二種情況下停止,并嘗試用這個"{"無效的 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;

    }

永遠不要忘記查看調試/打印雙方的每個數據,它可以提供幫助!


查看完整回答
反對 回復 2022-01-17
  • 2 回答
  • 0 關注
  • 402 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號