我知道问题有点奇怪,我只是出于纯粹的好奇心,因为我无法找到任何相关的信息。另外,请随意编辑标题,我知道它很可怕,但无法弥补更好。
假设我有类型对象的变量foo,它可以是short或者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);
任何?
答案 0 :(得分:0)
如果您通过网络传输它,则可能会遇到endianness个问题(即多字节值可能会以不同的字节顺序存储在不同的体系结构中)。通过网络发送多字节值时的标准约定是将其转换为Network Byte Order。
多字节值的接收器然后将其转换为Host Byte Order。
答案 1 :(得分:0)
要序列化变量,应将BitConverter.GetBytes()的结果分配给byte []。 如果你的变量很短或者是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,在答案中提到。
如果您需要发送短片和短片,那么您还需要将类型信息发送到另一端以了解数据类型是否已签名。 我现在不详细地写它,因为它会使代码复杂化。