uint debugValue = 0xDEADBEEF;
// get
var toExtractHigh = debugValue >> 16;
Console.WriteLine("{0:X}", toExtractHigh);
// set
uint toSetHigh = 0xABAD;
debugValue = debugValue & 0x0000FFFF | toSetHigh << 16;
// this would work too:
// debugValue = debugValue & 0xFFFF | toSetHigh << 16;
Console.WriteLine("{0:X}", debugValue);
Выход:
DEAD
ABADBEEF
C # имеет отличную поддержку для переменных, совместно использующих одно и то же место в памяти, и структурирование битов
источник: http://msdn.microsoft.com/en-us/library/acxa5b99(VS.80).aspx
using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
struct TestUnion
{
[FieldOffset(0)]
public uint Number;
[FieldOffset(0)]
public ushort Low;
[FieldOffset(2)]
public ushort High;
}
class MainClass
{
public static void Main(string[] args)
{
var x = new TestUnion { Number = 0xABADF00D };
Console.WriteLine("{0:X} {1:X} {2:X}", x.Number, x.High, x.Low);
x.Low = 0xFACE;
Console.WriteLine("{0:X} {1:X} {2:X}", x.Number, x.High, x.Low);
x.High = 0xDEAD;
Console.WriteLine("{0:X} {1:X} {2:X}", x.Number, x.High, x.Low);
}
}
Выход:
ABADF00D ABAD F00D
ABADFACE ABAD FACE
DEADFACE DEAD FACE
ПРИМЕЧАНИЕ. Поскольку в C # нет функции macro , как в C, вы можете использовать подход union для ускорения процесса. Это более производительно, чем передача переменной в методы / методы расширения
Или, если вы хотите кодировать C в C #, используйте unsafe
unsafe
{
uint value = 0xCAFEFEED;
// x86 is using low-endian.
// So low order array number gets the low order of the value
// And high order array number gets the high order of the value
Console.WriteLine(
"Get low order of {0:X}: {1:X}",
value, ((ushort *) &value)[0]);
Console.WriteLine(
"Get high order of {0:X}: {1:X}",
value, ((ushort*) &value)[1]);
((ushort*) &value)[1] = 0xABAD;
Console.WriteLine("Set high order to ABAD: {0:X}", value);
((ushort*) &value)[0] = 0xFACE;
Console.WriteLine("Set low order to FACE: {0:X}", value);
}
Выход:
Get low order of CAFEFEED: FEED
Get high order of CAFEFEED: CAFE
Set high order to ABAD: ABADFEED
Set low order to FACE: ABADFACE
Другой unsafe
подход:
unsafe
{
uint value = 0xCAFEFEED;
Console.WriteLine(
"Get low order of {0:X}: {1:X}",
value, ((TestUnion*) &value)->Low);
Console.WriteLine(
"Get high order of {0:X}: {1:X}",
value, ((TestUnion*) &value)->High);
((TestUnion*) &value)->High = 0xABAD;
Console.WriteLine("Set high order to ABAD: {0:X}", value);
((TestUnion*) &value)->Low = 0xFACE;
Console.WriteLine("Set low order to FACE: {0:X}", value);
}
Выход:
Get low order of CAFEFEED: FEED
Get high order of CAFEFEED: CAFE
Set high order to ABAD: ABADFEED
Set low order to FACE: ABADFACE