A byte
array can store binary data in C# programs. This data may be part of a data file, image file, compressed file or downloaded server response.
With byte
arrays, we have an ideal representation of this data. The byte
array type allows us to store low-level representations. It is useful in optimization.
To begin, we create a small byte
array in a C# program. Byte arrays can represent any values, but each individual byte
can only hold a certain range.
byte
array of 3 bytes. We store the minimum byte
value, and the maximum byte
value, in the array elements.foreach
-loop to display all the byte
elements in the byte
array.using System; // Part 1: create byte array. byte[] data = new byte[3]; data[0] = byte.MinValue; data[1] = 0; data[2] = byte.MaxValue; // Part 2: display byte data. foreach (var element in data) { Console.WriteLine(element); }0 0 255
Here we allocate a byte
array on the managed heap. The program measures the memory usage of the managed heap before and after this allocation occurs.
GC.GetTotalMemory
method gathers the memory usage figures from the system before and after the allocation of the byte
array.byte
array variable is assigned a reference to 3 million bytes in an array allocated on the managed heap.byte
array is a precise representation of bytes, not a higher-level construct.using System; byte[] array1 = null; // // Allocate three million bytes and measure memory usage. // long bytes1 = GC.GetTotalMemory(false); array1 = new byte[1000 * 1000 * 3]; array1[0] = 0; long bytes2 = GC.GetTotalMemory(false); Console.WriteLine(bytes2 - bytes1);3000032
We read in a byte
array from a file with the System.IO
namespace. An easy way to read a file into a binary array is the File.ReadAllBytes
method in the File class
.
using System; using System.IO; class Program { static void Main() { byte[] array = File.ReadAllBytes("C:\\profiles\\file.bin"); Console.WriteLine(array[0]); Console.WriteLine(array[1]); Console.WriteLine(array[2]); } }56 66 80
ToBase64String
When we have a byte
array, we do not just need to leave the data as a byte
array. We can convert it to a string
with ToBase64String
.
byte
array, and then encode it as a string
. This can be put in CSS or HTML files directly.using System; using System.IO; class Program { static void Main() { byte[] data = File.ReadAllBytes(@"C:\perls\i\2d-adventurers-map-background.jpg"); // Get base 64. string result = Convert.ToBase64String(data); // Write first 20 chars. Console.WriteLine("BASE64: " + result.Substring(0, 20) + "..."); } }BASE64: /9j/2wCEAAgGBgYGBggG...
byte
arrayA GZIP file must have certain bytes in its first few bytes. We use IsGZipHeader
to test a byte
array to see if it contains GZIP data.
Main
reads in a GZIP file, "2About.gz". The result value from IsGZipHeader
on this file is true.GZipTool
is a public static
class
, which means you can access it from other namespaces and files. It contains IsGZipHeader
.IsGZipHeader
returns true if the byte
data passed to it contains the values 31 and 139 in its first two bytes.using System; using System.IO; class Program { static void Main() { byte[] gzip = File.ReadAllBytes("2About.gz"); Console.WriteLine(GZipTool.IsGZipHeader(gzip)); byte[] text = File.ReadAllBytes("Program.cs"); Console.WriteLine(GZipTool.IsGZipHeader(text)); } } /// <summary> /// GZIP utility methods. /// </summary> public static class GZipTool { /// <summary> /// Checks the first two bytes in a GZIP file, which must be 31 and 139. /// </summary> public static bool IsGZipHeader(byte[] arr) { return arr.Length >= 2 && arr[0] == 31 && arr[1] == 139; } }True False
In C# programs we often use the byte
array type. It stores data in a compact way, with minimal overhead. The syntax must be learned, but it makes sense once it is familiar.