public static void TransformFloat(float val, byte[] buffer, int index) { var floatBytes = EndianAwareBitConverter.GetBytes(val, Endianness.Big); var intForm = (uint)EndianAwareBitConverter.ToInt32(floatBytes, Endianness.Big); var transformedIntForm = (intForm << 1) | (intForm >> 31); // Rotate left 1 bit var transformedBytes = EndianAwareBitConverter.GetBytes((int)transformedIntForm, Endianness.Big); Array.Copy(transformedBytes, 0, buffer, index, sizeof(float)); }
public static float ReverseTransformFloat(byte[] buffer, int index) { var bytes = new byte[sizeof(float)]; Array.Copy(buffer, index, bytes, 0, sizeof(float)); var intForm = (uint)EndianAwareBitConverter.ToInt32(bytes, Endianness.Big); var transformedIntForm = (intForm >> 1) | (intForm << 31); // Rotate right 1 bit var transformedBytes = EndianAwareBitConverter.GetBytes((int)transformedIntForm, Endianness.Big); return(EndianAwareBitConverter.ToSingle(transformedBytes, Endianness.Big)); }
public static byte[] TransformInt32Array(int[] data) { var bytes = new byte[data.Length * sizeof(int)]; for (var i = 0; i < data.Length; i++) { var transformed = TransformInt32(data[i]); var valueBytes = EndianAwareBitConverter.GetBytes(transformed, Endianness.Big); Array.Copy(valueBytes, 0, bytes, i * sizeof(int), sizeof(int)); } var interleaved = InterleaveBytes(bytes, sizeof(int)); return(interleaved); }
public static void WriteReferentArray(EndianAwareBinaryWriter writer, int[] values) { var bytes = new byte[values.Length * sizeof(int)]; var last = 0; for (var i = 0; i < values.Length; i++) { var val = values[i] - last; var transformed = TransformInt32(val); var valBytes = EndianAwareBitConverter.GetBytes(transformed, Endianness.Big); last = values[i]; Array.Copy(valBytes, 0, bytes, i * sizeof(int), sizeof(int)); } var interleaved = InterleaveBytes(bytes, sizeof(int)); writer.WriteBytes(interleaved); }
public static int[] ReadReferentArray(EndianAwareBinaryReader reader, int count) { var values = new int[count]; var bytes = reader.ReadBytes(count * sizeof(int)); var deinterleaved = DeinterleaveBytes(bytes, sizeof(int)); var last = 0; var buffer = new byte[sizeof(int)]; for (var i = 0; i < count; i++) { Array.Copy(deinterleaved, i * sizeof(int), buffer, 0, sizeof(int)); var value = EndianAwareBitConverter.ToInt32(buffer, Endianness.Big); value = ReverseTransformInt32(value); value += last; values[i] = value; last = value; } return(values); }
public static int[] ReverseTransformInt32Array(byte[] data) { if (data.Length % sizeof(int) != 0) { throw new ArgumentException("Invalid interleaved data. Data length must be a multiple of 4 bytes."); } var valueCount = data.Length / sizeof(int); var values = new int[valueCount]; var buffer = new byte[sizeof(int)]; var deinterleavedData = DeinterleaveBytes(data, sizeof(int)); for (var i = 0; i < valueCount; i++) { Array.Copy(deinterleavedData, i * sizeof(int), buffer, 0, sizeof(int)); var transformedValue = EndianAwareBitConverter.ToInt32(buffer, Endianness.Big); values[i] = ReverseTransformInt32(transformedValue); } return(values); }
public EndianAwareBinaryWriter(Stream output, System.Text.Encoding encoding, bool littleEndian) : base(output, encoding) { bitConverter = new EndianAwareBitConverter (littleEndian); }
public EndianAwareBinaryWriter(Stream output, bool littleEndian) : base(output) { bitConverter = new EndianAwareBitConverter (littleEndian); }
public static void WriteEnumerationArray(EndianAwareBinaryWriter writer, int[] values) { WriteInterleavedPropertyDataHelper(writer, values, sizeof(int), val => EndianAwareBitConverter.GetBytes(val, Endianness.Big)); }
public static void WriteBrickColorArray(EndianAwareBinaryWriter writer, BrickColor[] values) { WriteInterleavedPropertyDataHelper(writer, values, sizeof(int), val => EndianAwareBitConverter.GetBytes((int)val, Endianness.Big)); }
public static int[] ReadEnumerationArray(EndianAwareBinaryReader reader, int count) { return(ReadInterleavedPropertyDataArrayHelper(reader, count, sizeof(int), bytes => EndianAwareBitConverter.ToInt32(bytes, Endianness.Big))); }
public static BrickColor[] ReadBrickColorArray(EndianAwareBinaryReader reader, int count) { return(ReadInterleavedPropertyDataArrayHelper(reader, count, sizeof(int), bytes => (BrickColor)EndianAwareBitConverter.ToInt32(bytes, Endianness.Big))); }