How to Convert a byte array into an int array? I have a byte array holding 144 items and the ways I have tried are quite inefficient due to my inexperience. I am sorry if this has been answered before, but I couldn't find a good answer anywhere.
-
1What are the ways you have tried?Marlon– Marlon2012-06-20 02:57:32 +00:00Commented Jun 20, 2012 at 2:57
-
Just to mention - byte is 8 bit, int is 32 bit, and you are converting a byte to int. All of the converted ints will range from 0 to 255.Bakudan– Bakudan2017-07-26 20:16:59 +00:00Commented Jul 26, 2017 at 20:16
5 Answers
Simple:
//Where yourBytes is an initialized byte array.
int[] bytesAsInts = yourBytes.Select(x => (int)x).ToArray();
Make sure you include System.Linq with a using declaration:
using System.Linq;
And if LINQ isn't your thing, you can use this instead:
int[] bytesAsInts = Array.ConvertAll(yourBytes, c => (int)c);
4 Comments
System.Linq in your project. (Which version of the .NET framework are you targeting, by the way?)byte block copies. It's much faster to do int[] bytesAsInts = new int[ yourBytes.Length / 2 ]; Buffer.BlockCopy( yourBytes, 0, bytesAsInts, 0, yourBytes.Length );.byte[] will not properly cast the full 4 bytes of each int. Not sure why it is accepted.I known this is an old post, but if you were looking in the first place to get an array of integers packed in a byte array (and it could be considering your array byte of 144 elements), this is a way to do it:
var size = bytes.Count() / sizeof (int);
var ints = new int[size];
for (var index = 0; index < size; index++)
{
ints[index] = BitConverter.ToInt32(bytes, index * sizeof (int));
}
Note: take care of the endianness if needed. (And in most case it will)
2 Comments
int[] to byte[] but this solution should work regardlessUse Buffer.BlockCopy instead of Array.ConvertAll.
ref Converting an int[] to byte[] in C#
byte[] bytes = new byte[] { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8 };
int[] ints = Array.ConvertAll(bytes, Convert.ToInt32);
will return ints[] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8},
not return ints[] = {0x04030201,0x08070605}
You should use
Buffer.BlockCopy(bytes, 0, ints, 0, bytes.Length);
Comments
What you really need is:
Span<int> integerArray = MemoryMarshal.Cast<byte, int>(byteArray.AsSpan());