mirror of
https://github.com/Dongyifengs/AssetStudio-Genshin-MoYi.git
synced 2025-05-06 19:39:19 +08:00
108 lines
2.8 KiB
C#
108 lines
2.8 KiB
C#
|
using System;
|
||
|
using System.Runtime.CompilerServices;
|
||
|
using System.Runtime.InteropServices;
|
||
|
|
||
|
namespace AssetStudio
|
||
|
{
|
||
|
public static class BitConverterExtensions
|
||
|
{
|
||
|
[StructLayout(LayoutKind.Explicit)]
|
||
|
private struct FloatUIntUnion
|
||
|
{
|
||
|
[FieldOffset(0)]
|
||
|
public uint Int;
|
||
|
[FieldOffset(0)]
|
||
|
public float Float;
|
||
|
}
|
||
|
|
||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||
|
public static uint ToUInt32(float value)
|
||
|
{
|
||
|
return new FloatUIntUnion { Float = value }.Int;
|
||
|
}
|
||
|
|
||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||
|
public static ulong ToUInt64(double value)
|
||
|
{
|
||
|
return unchecked((ulong)BitConverter.DoubleToInt64Bits(value));
|
||
|
}
|
||
|
|
||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||
|
public static float ToSingle(uint value)
|
||
|
{
|
||
|
return new FloatUIntUnion { Int = value }.Float;
|
||
|
}
|
||
|
|
||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||
|
public static double ToDouble(ulong value)
|
||
|
{
|
||
|
return BitConverter.Int64BitsToDouble(unchecked((long)value));
|
||
|
}
|
||
|
|
||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||
|
public static void GetBytes(ushort value, byte[] buffer, int offset)
|
||
|
{
|
||
|
buffer[offset + 0] = unchecked((byte)(value >> 0));
|
||
|
buffer[offset + 1] = unchecked((byte)(value >> 8));
|
||
|
}
|
||
|
|
||
|
public static void GetBytes(uint value, byte[] buffer, int offset)
|
||
|
{
|
||
|
buffer[offset + 0] = unchecked((byte)(value >> 0));
|
||
|
buffer[offset + 1] = unchecked((byte)(value >> 8));
|
||
|
buffer[offset + 2] = unchecked((byte)(value >> 16));
|
||
|
buffer[offset + 3] = unchecked((byte)(value >> 24));
|
||
|
}
|
||
|
|
||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||
|
public static short Swap(short value)
|
||
|
{
|
||
|
return unchecked((short)(Swap(unchecked((ushort)value))));
|
||
|
}
|
||
|
|
||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||
|
public static ushort Swap(ushort value)
|
||
|
{
|
||
|
return unchecked((ushort)(value >> 8 | value << 8));
|
||
|
}
|
||
|
|
||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||
|
public static int Swap(int value)
|
||
|
{
|
||
|
return unchecked((int)(Swap(unchecked((uint)value))));
|
||
|
}
|
||
|
|
||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||
|
public static uint Swap(uint value)
|
||
|
{
|
||
|
value = value >> 16 | value << 16;
|
||
|
return ((value & 0xFF00FF00) >> 8) | ((value & 0x00FF00FF) << 8);
|
||
|
}
|
||
|
|
||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||
|
public static long Swap(long value)
|
||
|
{
|
||
|
return unchecked((long)(Swap(unchecked((ulong)value))));
|
||
|
}
|
||
|
|
||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||
|
public static ulong Swap(ulong value)
|
||
|
{
|
||
|
value = value >> 32 | value << 32;
|
||
|
value = ((value & 0xFFFF0000FFFF0000) >> 16) | ((value & 0x0000FFFF0000FFFF) << 16);
|
||
|
return ((value & 0xFF00FF00FF00FF00) >> 8) | ((value & 0x00FF00FF00FF00FF) << 8);
|
||
|
}
|
||
|
|
||
|
public static int GetDigitsCount(uint value)
|
||
|
{
|
||
|
int count = 0;
|
||
|
while (value != 0)
|
||
|
{
|
||
|
value /= 10;
|
||
|
count++;
|
||
|
}
|
||
|
return count;
|
||
|
}
|
||
|
}
|
||
|
}
|