gpt4 book ai didi

c# - 如何在 C# 中将结构转换为字节数组?

转载 作者:IT王子 更新时间:2023-10-29 03:41:29 30 4
gpt4 key购买 nike

如何在 C# 中将结构转换为字节数组?

我定义了这样一个结构:

public struct CIFSPacket
{
public uint protocolIdentifier; //The value must be "0xFF+'SMB'".
public byte command;

public byte errorClass;
public byte reserved;
public ushort error;

public byte flags;

//Here there are 14 bytes of data which is used differently among different dialects.
//I do want the flags2. However, so I'll try parsing them.
public ushort flags2;

public ushort treeId;
public ushort processId;
public ushort userId;
public ushort multiplexId;

//Trans request
public byte wordCount;//Count of parameter words defining the data portion of the packet.
//From here it might be undefined...

public int parametersStartIndex;

public ushort byteCount; //Buffer length
public int bufferStartIndex;

public string Buffer;
}

在我的主要方法中,我创建了它的一个实例并为其赋值:

CIFSPacket packet = new CIFSPacket();
packet.protocolIdentifier = 0xff;
packet.command = (byte)CommandTypes.SMB_COM_NEGOTIATE;
packet.errorClass = 0xff;
packet.error = 0;
packet.flags = 0x00;
packet.flags2 = 0x0001;
packet.multiplexId = 22;
packet.wordCount = 0;
packet.byteCount = 119;

packet.Buffer = "NT LM 0.12";

现在我想通过套接字发送这个数据包。为此,我需要将结构转换为字节数组。我该怎么做?

我的完整代码如下。

static void Main(string[] args)
{

Socket MyPing = new Socket(AddressFamily.InterNetwork,
SocketType.Stream , ProtocolType.Unspecified ) ;


MyPing.Connect("172.24.18.240", 139);

//Fake an IP Address so I can send with SendTo
IPAddress IP = new IPAddress(new byte[] { 172,24,18,240 });
IPEndPoint IPEP = new IPEndPoint(IP, 139);

//Local IP for Receiving
IPEndPoint Local = new IPEndPoint(IPAddress.Any, 0);
EndPoint EP = (EndPoint)Local;

CIFSPacket packet = new CIFSPacket();
packet.protocolIdentifier = 0xff;
packet.command = (byte)CommandTypes.SMB_COM_NEGOTIATE;
packet.errorClass = 0xff;
packet.error = 0;
packet.flags = 0x00;
packet.flags2 = 0x0001;
packet.multiplexId = 22;
packet.wordCount = 0;
packet.byteCount = 119;

packet.Buffer = "NT LM 0.12";

MyPing.SendTo(It takes byte array as parameter);
}

代码片段是什么?

最佳答案

这相当简单,使用编码。

文件顶部

using System.Runtime.InteropServices

函数

byte[] getBytes(CIFSPacket str) {
int size = Marshal.SizeOf(str);
byte[] arr = new byte[size];

IntPtr ptr = IntPtr.Zero;
try
{
ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(str, ptr, true);
Marshal.Copy(ptr, arr, 0, size);
}
finally
{
Marshal.FreeHGlobal(ptr);
}
return arr;
}

并将其转换回来:

CIFSPacket fromBytes(byte[] arr)
{
CIFSPacket str = new CIFSPacket();

int size = Marshal.SizeOf(str);
IntPtr ptr = IntPtr.Zero;
try
{
ptr = Marshal.AllocHGlobal(size);

Marshal.Copy(arr, 0, ptr, size);

str = (CIFSPacket)Marshal.PtrToStructure(ptr, str.GetType());
}
finally
{
Marshal.FreeHGlobal(ptr);
}
return str;
}

在您的结构中,您需要将其放在字符串之前

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string Buffer;

并确保 SizeConst 与最大可能的字符串一样大。

您可能应该阅读以下内容: http://msdn.microsoft.com/en-us/library/4ca6d5z7.aspx

关于c# - 如何在 C# 中将结构转换为字节数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3278827/

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