-2

我知道问题有点奇怪,我只是出于好奇而问,因为我找不到任何相关信息。另外,请随意编辑标题,我知道它很糟糕,但无法弥补。

假设我有一个对象类型的变量 foo,它要么是短的,要么是 ushort。我需要通过网络发送,所以我使用 BitConverter 将其转换为 byte[]:

byte[] b = new byte[2];
if(foo is short){
    BitConverter.GetBytes((short)foo, 0);
}else{
    BitConverter.GetBytes((ushort)foo, 0);
}

网络/套接字魔法发生了,我想要我的变量。我知道我期望得到的类型,所以我正确地调用了 BitConverter.GetUInt16 或 GetInt16。

现在,问题是 - 我如何序列化变量真的很重要吗?我的意思是,位是相同的,所以它不应该有任何意义,对吗?这样我就可以

BitConverter.GetBytes((short)foo, 0);

然后做

BitConverter.GetUInt16(myByteArray, 0);

任何人?

4

2 回答 2

0

如果您通过网络传输它,您可能会遇到字节顺序问题(即多字节值可能在不同架构上以不同的字节顺序存储)。通过网络发送多字节值的标准约定是将其转换为Network Byte Order

然后,多字节值的接收者会将其转换为Host Byte Order

于 2014-09-01T15:41:50.017 回答
0

要序列化您的变量,您应该将 BitConverter.GetBytes() 的结果分配给您的 byte[]。你的变量是short还是ushort都没有关系,因为它们的大小相同,并且在0到32767之间保持相同的值。只要大小合适,你应该没有问题。

所以你可以让你的代码像这样简单:

byte[] b;
if(foo is short || foo is ushort)
    b = BitConverter.GetBytes((short)foo); // You get proper results for ushort as well

但是在解码站点你必须知道你需要哪种类型,简而言之,你需要:

short foo = BitConverter.ToInt16(b, 0);

但如果你需要一个 ushort,那么你写:

ushort foo = BitConverter.ToUInt16(b, 0);

当您通过网络发送多字节变量时,您还应该确保它们按照@itsme86 在他的回答中提到的网络字节顺序排列。

如果需要同时发送shorts和ushorts,那么还需要向另一端发送类型信息,以了解数据类型是否有符号。我现在不详细写它,因为它会使代码复杂化。

于 2014-09-01T15:58:51.927 回答