请考虑以下代码:
using System;
using System.Runtime.InteropServices;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
const string test = "ABCDEF"; // Strings are immutable, right?
char[] chars = new StringToChar{str=test}.chr;
chars[0] = 'X';
// On an x32 release or debug build or on an x64 debug build,
// the following prints "XBCDEF".
// On an x64 release build, it prints "ABXDEF".
// In both cases, we have changed the contents of 'test' without using
// any 'unsafe' code...
Console.WriteLine(test); …Run Code Online (Sandbox Code Playgroud) 我有:
type Package =
abstract member Date : int
abstract member Save : unit -> unit
[<type:StructLayout(LayoutKind.Sequential, Pack=1, CharSet=CharSet.Ansi)>]
type Instant(date : int, value : int) =
let mutable _date = date
let mutable _value = value
member X.Value : int = _value
interface Package with
member X.Date : int = _date
member X.Save() = ...
Run Code Online (Sandbox Code Playgroud)
但是获得错误:只有没有隐式构造函数的结构和类可以被赋予'StructLayout'属性
所以我意识到它必须是相似的东西:
type Instant =
struct
val Date : byte array
...
Run Code Online (Sandbox Code Playgroud)
但是这样我丢失了界面.在C#中,例如type:StructLayout可以为这种类添加(我认为).我如何重构代码以避免此错误?
我有多个结构,都以头结构开头.像这样
public struct BaseProtocol {
public Header header;
public Footer footer;
};
Run Code Online (Sandbox Code Playgroud)
标题是
public struct Header {
public Byte start;
public Byte group;
public Byte dest;
public Byte source;
public Byte code;
public Byte status;
};
Run Code Online (Sandbox Code Playgroud)
现在的问题是我需要将它们与Byte []结合起来.我试过这个
[StructLayout( LayoutKind.Explicit, Size=255 )]
public struct RecBuffer {
[FieldOffset( 0 )]
public Header header;
[FieldOffset( 0 )]
[MarshalAs( UnmanagedType.ByValArray, ArraySubType = UnmanagedType.I1, SizeConst = 255 )]
public Byte[] buffer;
};
Run Code Online (Sandbox Code Playgroud)
当我用缓冲区填充数据时,我无法从标题中获取数据.如何使c#与c ++中的union相同?
我正在调试由 3rd 方编写的 C# 代码。该项目是一个旧的C++项目,由承包商用C#重写,我无法访问承包商。我创作了原始的 C++ 版本。
问题是当 C# 代码获取表示通过 UDP 连接接收的数据的结构的大小时。
结构体定义为:
[StructLayout(LayoutKind.Sequential,Pack=1)]
internal class PROXY_HDR {
public ushort pad;
public ushort label;
public char flags;
public ushort length;
public char[] ip = new char[4];
public ushort port;
}
Run Code Online (Sandbox Code Playgroud)
此结构的大小检索为:
int size = Marshal.Sizeof(typeof(PROXY_HDR));
Run Code Online (Sandbox Code Playgroud)
并且返回的值是 17 而不是预期的 13。有 4 个字节的差异,我怀疑是ip成员,但这只是因为它的表达方式与其他成员不同(使用“new”),但我没有其他依据可以决定.
我通常不会在我的 C# 代码中使用这种类型的封送处理来解析收到的数据包而不会出现问题,所以我不知道如何修改这个结构定义以使其与原始版本的大小“对齐”。
我可以用
int size = 13;
Run Code Online (Sandbox Code Playgroud)
但那是作弊,对吧?
我可以以某种方式修改此布局以使大小正确吗?