猿问

Xamarin 和 Golang - { []} 无效字符 '\x00' 寻找对象键字符串的开头

我今天来是因为我被困住了,这对我来说似乎不合逻辑。


我有我的服务器 ( Go ) 和我的智能手机应用程序 ( Xamarin C# )。


对于 Xamarin 方面,我正在使用这个包 -> Sockets Plugin for Xamarin and 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,所以它只能是我认为的阅读内容


如果有人可以帮忙,谢谢!


米琪卡哇伊
浏览 372回答 2
2回答

繁花如伊

您printConn阅读了消息,然后dec.Decode(&message)没有可阅读的内容。

交互式爱情

我发现是什么问题...为了在我的服务器/客户端之间交换消息,我使用 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]// GoEmixam23 == [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 functionpublic byte[] UnsignByteArray(byte[] bytes, int lenght)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; int index = 0;&nbsp; &nbsp; &nbsp; &nbsp; int i = 0;&nbsp; &nbsp; &nbsp; &nbsp; var array = new byte[lenght / 2];&nbsp; &nbsp; &nbsp; &nbsp; while (index < lenght)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; array[i] = bytes[index];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; index += 2;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i++;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return array;&nbsp; &nbsp; }public byte[] SignByteArray(byte[] bytes, int lenght)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; int index = 0;&nbsp; &nbsp; &nbsp; &nbsp; int i = 0;&nbsp; &nbsp; &nbsp; &nbsp; var array = new byte[lenght * 2];&nbsp; &nbsp; &nbsp; &nbsp; while (index < lenght)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; array[i] = bytes[index];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i++;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; index++;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; array[i] = 0;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i++;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return array;&nbsp; &nbsp; }永远不要忘记查看调试/打印双方的每个数据,它可以提供帮助!
随时随地看视频慕课网APP

相关分类

Go
我要回答