如何实现类似于c语言中的共用体

zhm1110 2010-07-12 05:31:51
c语言代码:
/*
* 64位浮点数转换共同体
*/
typedef union
{
double f;
#pragma pack(1)
struct
{
float f1;
float f2;
}ff;
#pragma pack()
unsigned char cf[8];
} tagToFloat;

我转成这样了:
/// <summary>
/// 64位浮点数转换共同体
/// </summary>
[System.Runtime.InteropServices.StructLayoutAttribute(LayoutKind.Explicit, Size = 64)]
class UnionFloat
{
[System.Runtime.InteropServices.FieldOffset(0)]
public double d;

[System.Runtime.InteropServices.FieldOffset(0)]
public float f1;
[System.Runtime.InteropServices.FieldOffset(32)]
public float f2;

[System.Runtime.InteropServices.FieldOffset(0)]
public char[] c;
}
总是提示这个错误:
因为它在 0 偏移位置处包含一个对象字段,该字段已由一个非对象字段不正确地对齐或重叠。
我应该怎么改?
在字符数组前加了这一句:
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)],
也不对。
...全文
289 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhm1110 2010-08-17
  • 打赏
  • 举报
回复
改成这段代码用c写,然后,c#里调用dll了,谢谢楼上的各位。
兔子-顾问 2010-07-14
  • 打赏
  • 举报
回复
忽略8楼我的回复,当时编译通过了。刚测试,居然真不行。奇怪了。我印象中这样用过的。可能我记错了。
zhm1110 2010-07-14
  • 打赏
  • 举报
回复
一会试一下大家说的方法。
thoughter 2010-07-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wuyazhe 的回复:]

忽略8楼我的回复,当时编译通过了。刚测试,居然真不行。奇怪了。我印象中这样用过的。可能我记错了。
[/Quote]
似乎与数组有关,只要里面有了数组就出错
thoughter 2010-07-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wuyazhe 的回复:]

C# code

[StructLayout(LayoutKind.Explicit)]
struct MyUnion
{
[FieldOffset(0)]
public int IntegerValue;
[FieldOffset(0)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
publ……
[/Quote]
[Quote]
未能从程序集“WindowsFormsApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型“WindowsFormsApplication1.MyUnion”,因为它在 0 偏移位置处包含一个对象字段,该字段已由一个非对象字段不正确地对齐或重叠。
[/Quote]
一声明o就出错
兔子-顾问 2010-07-13
  • 打赏
  • 举报
回复

[StructLayout(LayoutKind.Explicit)]
struct MyUnion
{
[FieldOffset(0)]
public int IntegerValue;
[FieldOffset(0)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public Byte[] bytes;
}


MyUnion o;
o.IntegerValue = 12;
o.bytes就是对应的字节。
thoughter 2010-07-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dancingbit 的回复:]

class改成struct
[/Quote]
一样的错误
因为它在 0 偏移位置处包含一个对象字段,该字段已由一个非对象字段不正确地对齐或重叠。
wuyq11 2010-07-13
  • 打赏
  • 举报
回复
[StructLayout(LayoutKind.Explicit)]
struct MyUnion
{
[FieldOffset(0)] byte someText;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public Byte[] Address;
}
dancingbit 2010-07-13
  • 打赏
  • 举报
回复
class改成struct
thoughter 2010-07-13
  • 打赏
  • 举报
回复
没人解答吗?
thoughter 2010-07-12
  • 打赏
  • 举报
回复
mark
关注
zhm1110 2010-07-12
  • 打赏
  • 举报
回复
没看明白,怎么处理?
angel6709 2010-07-12
  • 打赏
  • 举报
回复
做一个byte数组,自己解析

110,565

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧