如何在C#中将int转换为两个字节?

如何在C#中将int转换为两个字节?,c#,byte,int,C#,Byte,Int,假设您只需要低字节,如何将int转换为C#中的两个字节?: byte b0 = (byte)i, b1 = (byte)(i>>8); 但是,由于“int”是“Int32”,因此还有2个字节未捕获。您可以使用来获取包含Int32的字节。但是,结果中有4个字节,而不是2个。另一种方法,尽管没有其他方法那么灵巧: Int32 i = 38633; byte b0 = (byte)(i % 256); byte b1 = (byte)(i / 256); 是int16吗 In

假设您只需要低字节,如何将int转换为C#中的两个字节?

byte b0 = (byte)i,
     b1 = (byte)(i>>8);

但是,由于“int”是“Int32”,因此还有2个字节未捕获。

您可以使用来获取包含Int32的字节。但是,结果中有4个字节,而不是2个。

另一种方法,尽管没有其他方法那么灵巧:

Int32 i = 38633;
byte b0 = (byte)(i % 256);
byte b1 = (byte)(i / 256);
是int16吗

Int16 i = 7;
byte[] ba = BitConverter.GetBytes(i);
这将只有两个字节。

选项1:

byte[] buffer = BitConverter.GetBytes(number);
备选案文2:

byte[] buffer = new byte[2];

buffer[0] = (byte) number;
buffer[1] = (byte)(number >> 8);

我更喜欢选项1

int的哪一部分?两个字节不足以编码整个32位整数值。
int
需要4个字节存储。你想丢失MSBs中的信息吗?谁的哔哔声否决了这一点。这是一个有用且有趣的问题,因为C方式突然在C#中毫无理由地不起作用,而且明显的API也不存在(BitConverter在许多方面都很慢且损坏)。@Joshua如果切换到“不安全的”C#,C方式会起作用。@Joshua:它可能有用,也可能不有趣,但它的指定也很差。问题建议使用
int
/
Int32
,在这种情况下,OP需要最多的sig对吗?最小的sig对?每个都有一些?某种深奥的异或运算?我没有投反对票,但…这是我的解决方案。必须比BitConverter快得多。@Joshua,我做了一个快速基准测试(发布版本,50000000次迭代,秒表和完整测试重复两次以删除各种工件),创建数组和使用位屏蔽与调用BitConverter之间的区别在我的机器上每次调用大约1ns。如果删除数组创建(只需获取两个字节),差异大约为14ns。我不怀疑您的基准测试。相比之下,位转换器速度较慢,因为它必须分配数组。如果我可以预先检测数千个整数的数组大小,我可以节省大量的时间。@Joshua,非平凡当然是相对的。在14ns的差异下,您必须执行一百万次迭代,以观察额外阵列分配的14ms延迟。CLR为小型临时对象分配的内存实际上相当便宜。这是垃圾收集器设计的结果,它在收集过程中压缩堆,允许分配而不需要处理碎片。@Joshua-问题不是Mono-而是不同的endianness。shift方法完全解决了这一问题(我假设Mono注释针对的是BitConverter,而不是shift?),您能解释一下如何使用此解决方案从2个字节返回整数吗