C# 需要帮助转换吗 我尝试把下面的C++代码转换成C语言,但是我似乎没有把它弄对。 我在下面的.h头文件中得到了这个 public: unsigned char inquiry_data[256];

C# 需要帮助转换吗 我尝试把下面的C++代码转换成C语言,但是我似乎没有把它弄对。 我在下面的.h头文件中得到了这个 public: unsigned char inquiry_data[256];,c#,c++,C#,C++,然后是.cpp文件 sa = (PSCSI_ADDRESS)&inquiry_data[0]; 当我查看(PSCSI\u地址)的定义时,我得到以下信息: typedef struct _SCSI_ADDRESS { ULONG Length; UCHAR PortNumber; UCHAR PathId; UCHAR TargetId; UCHAR Lun; } SCSI_ADDRESS, *PSCSI_ADDRESS; 下面是我试图转换成

然后是.cpp文件

sa = (PSCSI_ADDRESS)&inquiry_data[0];
当我查看(
PSCSI\u地址
)的定义时,我得到以下信息:

typedef struct _SCSI_ADDRESS {
    ULONG Length;
    UCHAR PortNumber;
    UCHAR PathId;
    UCHAR TargetId;
    UCHAR Lun;

} SCSI_ADDRESS, *PSCSI_ADDRESS;

下面是我试图转换成C语言的内容#

但是,我在
(SCSI_地址)查询_数据[0]这一行不断出现错误无法将类型“byte”转换为“project1.Class.SCSI\u ADDRESS”


一开始,C++代码依赖于未定义的行为,您能建议吗?您不能将内存的任意部分强制转换为复杂类型,然后尝试访问它们


C#不允许这样的任意强制转换。如果您有兴趣将原始字节转换为数据,那么首先要查看.< /p>,C++代码依赖于未定义的行为。您不能将内存的任意部分强制转换为复杂类型,然后尝试访问它们

C#不允许这样的任意强制转换。如果你有兴趣把原始字节转换成数据,你想查看.< /p>

C不能像C++那样做数据转换。虽然固定类型,C++实际上不是强类型的——你可以把你想要的任何东西都投到你需要的任何地方。 现在,有了C#,事情就更复杂了,因为C#努力不让用户做不安全的事情。你想做的是得到一个bytestream,然后对编译器说,“把它当作一个

SCSI\u地址来处理

这样做是C,你可以使用序列化或不安全的部分。简短的和肮脏的(非常脏的)方法被简单地描述。

< P> C不能像C++那样做数据转换。虽然固定类型,C++实际上不是强类型的,你可以把你想要的东西投到你需要的任何地方。 现在,使用C#,事情变得更加复杂,因为C#努力不让用户做不安全的事情。你要做的是得到一个ByTestStream并对编译器说,“把它当作一个
SCSI_地址


要做到这一点,您可以使用序列化或不安全的部分。简而言之,这是一种快速而肮脏(非常肮脏)的方法。

下面是我对一个类似问题的回答

还有我几年前写的一篇关于期权的文章的链接

这个是做相反的事情的


以下是我对一个类似问题的回答

还有我几年前写的一篇关于期权的文章的链接

这个是做相反的事情的


在C#中,你想做什么是不可能的。第一个问题是打字问题。编译器将不允许您进行无法验证为有效的强制转换。这是为了类型安全

即使我们忽略了编译器的角色,您也会遇到数据在内存中如何表示的问题。因为C#是一种管理语言,所以内存中数据的存在方式不受您的控制。与C++不同,结构将不占用分配给它的内存。对象本身存在一些固有的内存空间开销。因此,从一开始,您就没有对齐,您的信息不会以您期望的方式转换


。虽然这并不是你想要做的,但它说明了几个基本的缺陷。1) 根据您使用的是32位还是64位版本的.Net,对象的大小将有所不同。这意味着,除非为不同的.Net实现编写不同版本的程序,否则无法实现一致的行为。即使这样,也不能保证乔恩观察到的行为,这是你不应该关心的事情。2) 对象的大小四舍五入为字节边界。因此,即使对象本身没有开销,对象的大小也不一定是各部分的总和,事实上它可能更大。

在C#中,您想做什么是不可能的。第一个问题是打字问题。编译器将不允许您进行无法验证为有效的强制转换。这是为了类型安全

即使我们忽略了编译器的角色,您也会遇到数据在内存中如何表示的问题。因为C#是一种管理语言,所以内存中数据的存在方式不受您的控制。与C++不同,结构将不占用分配给它的内存。对象本身存在一些固有的内存空间开销。因此,从一开始,您就没有对齐,您的信息不会以您期望的方式转换


。虽然这并不是你想要做的,但它说明了几个基本的缺陷。1) 根据您使用的是32位还是64位版本的.Net,对象的大小将有所不同。这意味着,除非为不同的.Net实现编写不同版本的程序,否则无法实现一致的行为。即使这样,也不能保证乔恩观察到的行为,这是你不应该关心的事情。2) 对象的大小四舍五入为字节边界。因此,即使对象本身没有开销,对象的大小也不一定是各部分的总和,事实上它可能更大。

我将用以下方式解决这个问题:

首先我要做一个课程:

 class SCSI_ADDRESS
{
    public ulong Length;
    public byte PortNumber;
    public byte PathId;
    public byte TargetId;
    public byte Lun;

    public SCSI_ADDRESS(ulong Length, byte PortNumber, byte PathId, byte TargetId, byte Lun)
    {
        this.Length = Length;
        this.PortNumber = PortNumber;
        this.PathId = PathId;
        this.TargetId = TargetId;
        this.Lun = Lun;
    }

}
然后在主要方法中,我将执行以下操作

static void Main(string[] args)
{
   Object[] o = new Object[256];
   SCSI_ADDRESS sa = new SCSI_ADDRESS(10, 1, 1, 1, 1); //example
   o[0] = sa;
}

我希望这有帮助

我会用以下方法解决这个问题:

public class SCSI_ADDRESS
{   
    public uint Length;     // 4 bytes, (uint in C# == ulong in C++)
    public byte PortNumber; // 1 byte
    public byte PathId;     // 1 byte
    public byte TargetId;   // 1 byte
    public byte Lun;        // 1 byte
                            // Total: 8 bytes

}

// 256 / sizeof(SCSI_ADDRESS) == 256 / 8 == 32
public SCSI_ADDRESS[] inquiry_data = new byte[256 / sizeof(SCSI_ADDRESS)];

sa = inquiry_data[0];
首先我要做一个课程:

 class SCSI_ADDRESS
{
    public ulong Length;
    public byte PortNumber;
    public byte PathId;
    public byte TargetId;
    public byte Lun;

    public SCSI_ADDRESS(ulong Length, byte PortNumber, byte PathId, byte TargetId, byte Lun)
    {
        this.Length = Length;
        this.PortNumber = PortNumber;
        this.PathId = PathId;
        this.TargetId = TargetId;
        this.Lun = Lun;
    }

}
然后在主要方法中,我将执行以下操作

static void Main(string[] args)
{
   Object[] o = new Object[256];
   SCSI_ADDRESS sa = new SCSI_ADDRESS(10, 1, 1, 1, 1); //example
   o[0] = sa;
}

我希望这有帮助

char
数组被明确允许别名其他类型,因此根据上下文的不同,它似乎是合法的(当然,直接连接到C#是不可能的),它不是未定义的行为。它是实现定义的,似乎比我想象的要难。为什么它需要序列化?难道没有更简单的方法来转换代码吗?@Oli:like I sa
public class SCSI_ADDRESS
{   
    public uint Length;     // 4 bytes, (uint in C# == ulong in C++)
    public byte PortNumber; // 1 byte
    public byte PathId;     // 1 byte
    public byte TargetId;   // 1 byte
    public byte Lun;        // 1 byte
                            // Total: 8 bytes

}

// 256 / sizeof(SCSI_ADDRESS) == 256 / 8 == 32
public SCSI_ADDRESS[] inquiry_data = new byte[256 / sizeof(SCSI_ADDRESS)];

sa = inquiry_data[0];