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