Le code suivant lit et inverse les données dans des blocs de 32 bits comme des entiers. Le code pour inverser les bits est divisé en deux parties parce que sur une machine peu endian lecture quatre octets comme un entier de 32 bits inverse l'ordre des octets.
private static void Main()
{
var lineLength = 52;
var input = new Byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0xAE, 0xF0, 0x00 };
var output = new Byte[input.Length];
UInt32 lastValue = 0x00000000;
var numberBlocks = lineLength/32 + ((lineLength % 32 == 0) ? 0 : 1);
var numberBitsInLastBlock = lineLength % 32;
for (Int32 block = 0; block < numberBlocks; block++)
{
var rawValue = BitConverter.ToUInt32(input, 4 * block);
var reversedValue = (ReverseBitsA(rawValue) << (32 - numberBitsInLastBlock)) | (lastValue >> numberBitsInLastBlock);
lastValue = rawValue;
BitConverter.GetBytes(ReverseBitsB(reversedValue)).CopyTo(output, 4 * (numberBlocks - block - 1));
}
Console.WriteLine(BitConverter.ToString(input).Replace('-', ' '));
Console.WriteLine(BitConverter.ToString(output).Replace('-', ' '));
}
private static UInt32 SwapBitGroups(UInt32 value, UInt32 mask, Int32 shift)
{
return ((value & mask) << shift) | ((value & ~mask) >> shift);
}
private static UInt32 ReverseBitsA(UInt32 value)
{
value = SwapBitGroups(value, 0x55555555, 1);
value = SwapBitGroups(value, 0x33333333, 2);
value = SwapBitGroups(value, 0x0F0F0F0F, 4);
return value;
}
private static UInt32 ReverseBitsB(UInt32 value)
{
value = SwapBitGroups(value, 0x00FF00FF, 8);
value = SwapBitGroups(value, 0x0000FFFF, 16);
return value;
}
Il est un peu moche et pas robuste contre les erreurs ... mais c'est juste un exemple de code. Et il produit ce qui suit.
FF FF FF FF 77 AE F0 00
F7 5E EF FF FF FF F0 00
Si pas être '00 01 3A F7 FF FF FF FF' (ou' 3A F7 FF FF FF FF F0 si vous connaissez 00 'la largeur est de 90 bits)? –
90 bits? Il n'y a que 64 bits et la ligne n'a que 52 bits de largeur; les 12 bits restants sont simplement des bits de remplissage. Au moins est-ce que l'exemple suggère - inverser les 52 premiers bits de FF FF FF 77 AE F0 00 rendements F7 5E EF FF FF F0 00. –