C# - 不同类型的字节表示不同吗?

时间:2014-09-01 15:27:33

标签: c# bitconverter

我知道问题有点奇怪,我只是出于纯粹的好奇心,因为我无法找到任何相关的信息。另外,请随意编辑标题,我知道它很可怕,但无法弥补更好。

假设我有类型对象的变量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);

任何?

2 个答案:

答案 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,在答案中提到。

如果您需要发送短片和短片,那么您还需要将类型信息发送到另一端以了解数据类型是否已签名。 我现在不详细地写它,因为它会使代码复杂化。