[英]C++ Conversion To C#
我有以下情况:
struct object1 {
bool a:1;
bool b:1;
uint8_t c:2;
bool d:1;
abc e:3;
uint16_t header;
uint8_t footer;
uint8_t mid[4];
}
我可能不知道语法,但在C#中使用bit并不像C ++那么容易。 我已经使用BitArray和BitConverter类来制作填充数据的方法,但我遇到了问题:
object1 * rqr = (object1 *) &Msg.Data[2];
基本上他们将对象转换为字节数组。 我所做的每一次搜索都会尖叫序列化但是为了真正转换上面的行我不能有任何额外的元数据或任何东西。
我真的想创建一个指向内存位置的指针,并将该位置“强制转换”到所述对象。 这可能吗? 如果没有,是否有解决此问题的方法? 我无法想象这个级别的位操作已被完全排除在外。 在假设之前,我默认我不知道。
编辑::我知道C#不允许指向管理类型。 我问的是,如果有办法说:
Byte[] ayData = new Byte[8];
ObjectOfSize8 nObject = (ObjectOfSize8)ayData;
我理解上面的内容不起作用,但是,如果你足够聪明地理解对象的内存大小,那么语言中是否会有允许数据转换的内容?
您可以使用一个处理位移和屏蔽的结构来解决您的位域问题:
[StructLayout(LayoutKind.Sequential, Size=1)]
public struct BitField8
{
private byte _bits;
private static readonly byte[] Masks = new byte[] { 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff };
public BitField8(int val)
{
_bits = (byte) val;
}
public byte Get(int bit, int length = 1)
{
int shift = bit + length - 1;
return (byte) ((_bits >> shift) & Masks[length-1]);
}
public void Set(int bit, int length, int val)
{
int mask = Masks[length-1];
int shift = bit + length - 1;
val = (val & mask) << shift;
mask = ~(mask << shift);
_bits = (byte)((_bits & mask) | val);
}
}
所以在你的例子中:
bool a:1;
bool b:1;
uint8_t c:2;
bool d:1;
abc e:3;
你会设置a
通过调用Set(0, 1, 1)
设置为1)。
要给c
值3,你可以调用Set(3, 2, 3)
。 ( c
占据第2位和第3位)。
这基本上复制了C ++位域的功能,虽然我承认我可能有错误的位顺序。 我真的不知道C ++编译器a
在位0还是在位7。
您可以使用16位,32位和64位位域执行类似操作。
所以你的结构将包含:
BitField8 myBitfield;
你不能用C#中的类型转换来做你所要求的。 我怀疑做你需要的最干净的方法可能是固定C#结构。 然后你有一个可以与Marshal.Copy一起使用的IntPtr来复制到一个字节数组。
至于位域,它们需要使用按位移位,按位OR和按位AND运算来管理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.