2 回答
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;
}
永远不要忘记查看调试/打印双方的每个数据,它可以提供帮助!
- 2 回答
- 0 关注
- 371 浏览
添加回答
举报