laatzen/Common/CommonMessurementUnits/BitExtensions.cs
2023-09-14 13:04:12 +02:00

118 lines
3.5 KiB
C#

using System;
using System.Linq;
using System.Text;
namespace Xylem.Common.CommonCore.CommonMeasurementUnits
{
public static class BitExtensions
{
public static Byte[] GetBits(this Byte[] bytes)
{
if (bytes is null)
{
return Array.Empty<Byte>();
}
var bytesCount = bytes.Length;
var bitsCount = bytesCount * 8;
var bits = new Byte[bitsCount];
var bit = 0;
foreach (var @byte in bytes)
{
for (Int32 b = 7; b >= 0; b--)
{
bits[bit++] = (Byte)((@byte >> b) % 2);
}
}
return bits;
}
public static Byte[] GetBytes(this Byte value, Int32 take = 1)
=> Enumerable.Take(BitConverter.GetBytes(value), take);
public static Byte[] GetBytes(this SByte value, Int32 take = 2)
=> Enumerable.Take(BitConverter.GetBytes(value), take);
public static Byte[] GetBytes(this Int16 value, Int32 take = 2)
=> Enumerable.Take(BitConverter.GetBytes(value), 2);
public static Byte[] GetBytes(this UInt16 value, Int32 take = 2)
=> Enumerable.Take(BitConverter.GetBytes(value), 2);
public static Byte[] GetBytes(this Int32 value, Int32 take = 4)
=> Enumerable.Take(BitConverter.GetBytes(value), take);
public static Byte[] GetBytes(this UInt32 value, Int32 take = 4)
=> Enumerable.Take(BitConverter.GetBytes(value), take);
public static Byte[] GetBytes(this Int64 value, Int32 take = 8)
=> Enumerable.Take(BitConverter.GetBytes(value), take);
public static Byte[] GetBytes(this UInt64 value, Int32 take = 8)
=> Enumerable.Take(BitConverter.GetBytes(value), take);
public static Byte[] GetBytes(this Double value)
=> BitConverter.GetBytes(value);
public static Byte[] GetBytes(this String value)
=> Encoding.ASCII.GetBytes(value);
public static Byte[] Swap(this Byte[] bytes)
{
if (bytes is null)
{
return Array.Empty<Byte>();
}
var length = bytes.Length;
var swapped = new Byte[length];
for (Int32 x = 0; x < length; x++)
{
swapped[x] = bytes[length - x - 1];
}
return swapped;
}
public static Byte[] Take(this Byte[] bytesSRC, Int32 count)
{
if (bytesSRC is null || count < 0)
{
return Array.Empty<Byte>();
}
var bytesDST = new Byte[count];
Array.Copy(bytesSRC, 0, bytesDST, 0, count);
return bytesDST;
}
public static String ToHex(this Byte[] value, String separator = " ")
{
if (value is null)
{
return string.Empty;
}
return BitConverter.ToString(value).Replace("-", separator);
}
public static Byte[] FromHex(this String value, String separator = " ")
{
if (string.IsNullOrWhiteSpace(value))
{
return Array.Empty<Byte>();
}
return value
.Split(new[] { separator }, StringSplitOptions.RemoveEmptyEntries)
.Select(x => byte.TryParse(x, out Byte b) ? b : default(Byte))
.ToArray();
}
}
}