2011-05-05 148 views
34

我知道如何做到这一点:通过创建必要大小的字节数组并使用for-loop来投射int数组中的每个元素。将int []转换为C#中的byte []

我想知道是否有更快的方法,因为如果int大于sbyte,上面的方法似乎会中断。

+0

'byte array'和“大于'short'”不匹配。 – 2011-05-05 12:15:29

+1

一小段代码可以消除这么多的猜测。 – 2011-05-05 12:16:13

+0

我的意思是int不是一对一的字节大小。 – soandos 2011-05-05 12:30:12

回答

75

如果你想按位拷贝,即得到4个字节了一个整型,然后使用Buffer.BlockCopy

byte[] result = new byte[intArray.Length * sizeof(int)]; 
Buffer.BlockCopy(intArray, 0, result, 0, result.Length); 

不要使用Array.Copy,因为它会尝试转换,而不仅仅是复制。请参阅MSDN页面上的备注以获取更多信息。

+0

它如何知道每个int获得4个字节? – soandos 2011-05-05 12:32:55

+1

它只是复制内存。它不知道“int”或“byte”。 'result'的内存表示将与'intArray'的内存表示完全相同。 – 2011-05-05 12:35:58

+0

你会怎么做呢?采取一个字节[]并将其复制到一个int []? – Moop 2013-11-15 16:46:27

-2
int[] ints = { 1, 2, 3, 4, 5, 6 }; 
byte[] bytes = ints.Select(x => (byte)x).ToArray(); 
+7

-1:**这只是错误的**:(1)您缺少'ToArray()' ,所以它甚至不会编译。 (2)解决该问题后,您将会收到一个异常,因为Cast只会取消装箱值。更多信息:http://stackoverflow.com/questions/445471/puzzling-enumerable-cast-invalidcastexception – 2011-05-05 13:31:27

+0

@Daniel:Woops,编码,没有测试它。感谢您指出了这一点。 – 2011-05-06 10:21:02

+1

new [] {1,2,3} .Select(n =>(byte)n).ToArray()的工作原理是 – JackNova 2012-12-24 17:07:47

5

除了公认的答案(我现在用的),另一种只有一行对LINQ爱好者将是:

byte[] bytes = ints.SelectMany(BitConverter.GetBytes).ToArray(); 

我想,虽然,这将是慢...

+0

是的,但它的罚款快速短单元测试。提出了一个编辑,因为你不需要'v =>'... ... yptes(v)' – 2016-02-12 11:42:41