Iva*_*nov 2 c# c++ pointers code-translation
C++代码:
struct tPacket
{
WORD word1;
WORD word2;
BYTE byte1;
BYTE byte2;
BYTE array123[8];
}
static char data[8192] = {0};
...
some code to fill up the array
...
tPacket * packet = (tPacket *)data;
Run Code Online (Sandbox Code Playgroud)
我们不能在C#中轻松做到这一点.
请注意,C++结构中有一个数组.
或者,使用此源文件可以为我们完成工作,但如果结构中有数组则不行.
我不确定你究竟在问什么.您是否尝试在C#中获取等效的结构定义以用于普通的旧C#用法或用于互操作(PInvoke)目的?如果它适用于PInvoke,则follownig结构将起作用
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct tPacket {
/// WORD->unsigned short
public ushort word1;
/// WORD->unsigned short
public ushort word2;
/// BYTE->unsigned char
public byte byte1;
/// BYTE->unsigned char
public byte byte2;
/// BYTE[8]
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=8, ArraySubType=System.Runtime.InteropServices.UnmanagedType.I1)]
public byte[] array123;
}
Run Code Online (Sandbox Code Playgroud)
如果您正在寻找具有相同特征的普通旧C#结构,那么遗憾的是不可能使用结构.您无法在C#结构中定义常量大小的内联数组,也无法通过初始化程序强制数组为特定大小.
托管世界中有两种备选方案.
使用具有填充数组的create方法的结构
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct tPacket {
public ushort word1;
public ushort word2;
public byte byte1;
public byte byte2;
public byte[] array123;
public static tPacket Create() {
return new tPacket() { array123 = new byte[8] };
}
}
Run Code Online (Sandbox Code Playgroud)
或者使用一个类,您可以直接初始化array123成员变量.
EDIT OP知道如何将byte []转换为tPacket值
不幸的是,在C#中没有很好的方法可以做到这一点.C++对于这种任务很棒,因为它有一个非常弱的类型系统,你可以选择将字节流视为一个特定的结构(邪恶的指针转换).
这在C#不安全代码中可能是可能的,但我不相信.
基本上,您需要做的是手动解析字节并将它们分配给结构中的各种值.或者编写一个本地方法,将C样式转换和PInvoke转换为该函数.
归档时间: |
|
查看次数: |
6612 次 |
最近记录: |