gpt4 book ai didi

c# - C++ union 到 C# worker 类(Class)

转载 作者:搜寻专家 更新时间:2023-10-31 01:28:54 25 4
gpt4 key购买 nike

我只了解一点 C++ 中的 union 是如何工作的。第一个评论 block 我想我已经在 c# 类 mac_const 中复制了。 (如果不是请说明原因)我目前不担心效率,只是它能正常工作。第二个评论区我什至不知道从哪里开始翻译它。我不知道数据 [2] 被映射到哪里,有人可以

//union {
// unsigned short wd[4];
// double data;
// __int64 data64;
//}
//dbl_cnvt;

public class mac_const
{
byte[] basedata = new byte[8];
//public ushort[] wd
public ushort this[byte index]
{
get { return BitConverter.ToUInt16(basedata, index * 2); }
set { Array.Copy(BitConverter.GetBytes(value), 0, basedata, index * 2, 2); }
}
public double data
{
get { return BitConverter.ToDouble(basedata, 0); }
set { basedata = BitConverter.GetBytes(value); }
}
public long data64
{
get { return BitConverter.ToInt64(basedata, 0); }
set { basedata = BitConverter.GetBytes(value); }
}
}


//union {
// unsigned short cmd[4];
// unsigned long data[2];
// __int64 data64;
//}
//data_conversion;

public class data_conversion_csharp
{
byte[] basedata = new byte[8];
// the c++ class only
//public ushort[] cmd
public ushort this[byte index]
{
get { return BitConverter.ToUInt16(basedata, index * 2); }
set { Array.Copy(BitConverter.GetBytes(value), 0, basedata, index * 2, 2); }
}
public long[] data
{
// not sure what the mapping would be here, or if this should be data1 and data2 instead of an array
???
}
public long data64
{
???
}
}

编辑 - 关于 union 必要性的解释@ffhighwind我正在尝试移植一些使用 union 的 C++ 代码,因为它们应该是我不明白如何映射到数据中的第二个 long

lng_cnvt.data64 = (dbl_cnvt.data64 >> 6) + (long)0x400000000000; 

if (data < 0)
{
lng_cnvt.data64 = -lng_cnvt.data64;
lng_cnvt.cmd[3] = 0;
if (lng_cnvt.data64 == (__int64)0xC00000000000)
{
lng_cnvt.data64 = (__int64)0x800000000000;
exp -= 1;
}
}
lng_cnvt.cmd[0] = (Ushort)((lng_cnvt.cmd[0] & 0xF000) | exp);
*ldata++ = lng_cnvt.ldata[0] & 0xFFFFFFL;
*ldata++ = ((lng_cnvt.data[0] >> 24) & 0x000FFL) |
((lng_cnvt.data[1] << 8) & 0x0FFFF00L);

最佳答案

我没有投反对票,但没有 50 多个代表我无法发表评论,所以也许其他人在同一条船上。这样做的目的是什么?为什么不能转换为对象?

也许您想限制对象可以包含的类型。如果是这样,这行吗?

class MyUnion
{
object obj;

MyUnion(SomeType o) { obj = o; }
//... constructors for all accepted Types

public object Value { get { return obj; } }
}

C# 是托管的,因此您不能真正期望对数据进行微调的低级别控制。如果你想要像 C++ 这样的微调控制,你需要 sizeofunmanaged unsafe code .

编辑:显然你可以像 Jonathon Chase 所说的那样使用属性创建 union 。

关于c# - C++ union 到 C# worker 类(Class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50958521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com