当前位置:编程学习 > C#/ASP.NET >>

DELPHI转C#问题

在DELPHI中,代码如下:
//one card 
TCardNumber = packed record 
  case Integer of 
   0:(dwCardNo : Cardinal);   //Decimal:Card No. 
   1:(wCardID,wCardZn : Word); //Wiegand : Card Offset,Card Sector 
   2:(Byte : array[1..3] of byte); 
end;

把上面这段转到C#里面该如何做?
关键是 TCardNumber = packed record  这个在C#里面怎么定义?
请大家帮帮我。谢谢 --------------------编程问答-------------------- 不熟悉Delphi,不过如果想转化为C#,就必须先知道packed record是什么样的数据或者类。
楼主能说明一下么? --------------------编程问答-------------------- 就是结构体了
你还需要手工对齐。 --------------------编程问答--------------------
引用楼主 liuxiaolong1113 的帖子:
在DELPHI中,代码如下: 
//one card  
TCardNumber = packed record  
  case Integer of  
   0:(dwCardNo : Cardinal);   //Decimal:Card No.  
   1:(wCardID,wCardZn : Word); //Wiegand : Card Offset,Card Sector  
   2:(Byte : array[1..3] of byte);  
end; 

把上面这段转到C#里面该如何做? 
关键是 TCardNumber = packed record  这个在C#里面怎么定义? 
请大家帮帮我。谢谢


定义一个(有限的)“万能”类型。或者叫共用体,这个共用体由dwCardNo、wCardID+wCardZn、Byte[4]共用同一内存,以其中占用空间最大的部分确定为该结构的内存空间大小,并以首地址对齐. --------------------编程问答--------------------
引用 1 楼 robytree 的回复:
不熟悉Delphi,不过如果想转化为C#,就必须先知道packed record是什么样的数据或者类。 
楼主能说明一下么?


定义一个(有限的)“万能”类型。或者叫共用体,这个共用体由dwCardNo、wCardID+wCardZn、Byte[4]共用同一内存,以其中占用空间最大的部分确定为该结构的内存空间大小,并以首地址对齐. --------------------编程问答-------------------- 你说的共用体,有点想c的联合。 --------------------编程问答--------------------

[StructLayout(LayoutKind.Explicit, Size=8)]
struct TCardNumber
{
    [FieldOffset(0)]
    public int dwCardNo;

    [FieldOffset(0)]
    public int wCardID;

    [FieldOffset(4)]
    public int wCardID;

    [FieldOffset(0)]
    public unsafe byte[4] bytes;
}
--------------------编程问答--------------------
引用 6 楼 chenjx00 的回复:
C# code
[StructLayout(LayoutKind.Explicit, Size=8)]
struct TCardNumber
{
    [FieldOffset(0)]
    public int dwCardNo;

    [FieldOffset(0)]
    public int wCardID;

    [FieldOffset(4)]
    public int wCardID;

    [FieldOffset(0)]
    public unsafe byte[4] bytes;
}



按照你这样操作 出现 
“其他信息: 未能从程序集 DPU3001EG, Version=1.0.2988.29926, Culture=neutral, PublicKeyToken=null 中加载类型 DPU3001EG.TCardNumber,因为它在 0 偏移位置处包含一个对象字段,该字段已由一个非对象字段不正确地对齐或重叠。”
--------------------编程问答--------------------

[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Explicit, Size=8)]
unsafe struct TCardNumber
{
    [System.Runtime.InteropServices.FieldOffset(0)]
    public int dwCardNo;

    [System.Runtime.InteropServices.FieldOffset(0)]
    public int wCardID;

    [System.Runtime.InteropServices.FieldOffset(4)]
    public int wCardZn;

    [System.Runtime.InteropServices.FieldOffset(0)] 
    public fixed byte bytes[4]; 
}

之前那段代码我没测,这段代码我测过是编译通过的. --------------------编程问答-------------------- “DPU3001.cs(32): 不安全代码只会在使用 /unsafe 编译的情况下出现”

是不是在VS2003中不可以用? --------------------编程问答-------------------- public fixed byte bytes[4]; 

在2003中语法错误 --------------------编程问答--------------------
引用 9 楼 liuxiaolong1113 的回复:
“DPU3001.cs(32): 不安全代码只会在使用 /unsafe 编译的情况下出现” 

是不是在VS2003中不可以用?


不安全代码默认是不允许的,你要把它打开.
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,