如果我创建一个相对较大的结构,我如何计算它在内存中占用的字节数?
我们可以手动完成,但如果结构足够大,那么我们该怎么做呢?是否有一些代码块或应用程序?
我正在寻找C#中序列化的语言支持.我可以从ISerializable派生并通过在字节缓冲区中复制成员值来实现序列化.但是,我更喜欢像C/C++那样的自动方式.
请考虑以下代码:
using System;
using System.Text;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
namespace XBeeHelper
{
class XBee
{
[Serializable()]
public struct Frame<FrameType> where FrameType : struct
{
public Byte StartDelimiter;
public UInt16 Lenght;
public Byte APIIdentifier;
public FrameType FrameData;
public Byte Checksum;
}
[Serializable()]
public struct ModemStatus
{
public Byte Status;
}
public Byte[] TestSerialization()
{
Frame<ModemStatus> frame = new Frame<ModemStatus>();
frame.StartDelimiter = 1;
frame.Lenght = 2;
frame.APIIdentifier = 3;
frame.FrameData.Status = 4;
frame.Checksum = 5;
BinaryFormatter formatter = new …Run Code Online (Sandbox Code Playgroud) 在下面的示例C#代码中,我有一个从套接字读取的字节数组.我想将数据解析为'exampleClass'的各个字段(前8个字节到64位变量'field1',接下来4个字节到32位变量'field2'等)
using System;
namespace CsByteCopy
{
class Program
{
class ExampleClass
{
public UInt64 field1;
public UInt32 field2;
public UInt16 field3;
public byte[] field4 = new byte[18];
}
static void Main(string[] args)
{
byte[] exampleData =
{
// These 8 bytes should go in 'field1'
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
// These 4 bytes should go in 'field2'
0x08,0x09,0x0A,0x0B,
// These 2 bytes should go in 'field3'
0x0C,0x0D,
// These 18 * 1 bytes should go in 'field4'
0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
};
ExampleClass exampleClass = new …Run Code Online (Sandbox Code Playgroud) 我是C#中的二进制文件的新手,对最佳方法有疑问.我有一个我正在尝试通信的应用程序,它具有特定的二进制消息格式.它必须以B8十六进制代码开头,并以十六进制代码结束BB,其间包含二进制消息.能够获取字节缓冲区并将其转换为消息以便于访问消息属性的最佳方法是什么?我想象一个结构,但说实话,我真的不知道.
编辑:
我不希望它在二进制文件中的原因是我可以轻松使用我的应用程序中的数据.例如,我想将表示命令类型的二进制位转换为枚举.像这样(只是我想做的事情的代表):
struct CommandMessage
{
public CommandType Command { get; set; }
public object Data { get; set; }
}
enum CommandType
{
UserJoined,
MessageReceived
}
Run Code Online (Sandbox Code Playgroud) 我想将 Color[] 保存到文件中。为此,我发现使用“System.IO.File.WriteAllBytes”将字节数组保存到文件应该非常有效。
我想以一种安全的方式将我的 Color[](结构数组)转换为字节数组:
如果可能,最好有一种通用的方法将字节数组转换为任何结构(T 结构)数组,反之亦然。
如果不可能,为什么?
谢谢,埃里克
我认为这两个解决方案制作了一个我想避免的副本,而且它们都使用 Marshal.PtrToStructure 特定于结构而不是结构数组:
我是C#的新手.
我试图理解为什么结构大小增长.
即:
struct Test
{
float x;
int y;
char z;
}
Run Code Online (Sandbox Code Playgroud)
Test结构的大小实际上是10个字节(float = 4,int = 4,char = 2).
但是,当我试图用Marshal.SizeOf(..)方法获得sizeof结构时,我得到了12.
在C++中我做pragma pack(1)了防止这个但是我怎么能在C#中做到这一点?
另一个问题:
当我试图将Test结构转换为字节数组时,如果结构不是[Serialize]我得到的字节数组大小为12字节为例外(或不是),但如果结构是[Serialize]我得到大小为170字节的字节数组,为什么会这样?
谢谢!:)
我想将Date一部分序列DateTime化为4个字节(可能是Int32).最快的方法是什么?
背景:为了序列化一个完整的DateTime我到目前为止一直在使用该ToBinary方法.它返回Int64我在其他地方存储的内容.现在,我只储存要求Date的部分DateTime只使用一半的空间.所以,我想知道如何以最快的方式实现这一点,因为性能至关重要.
我想到的选项是:
int通过使用一些乘法和属性访问来编码年,月,日和YYYYMMDD,这种编码是人类可读的良好副作用.ToBinary并保留返回的"上半部分或下半部分" long.不知道是否可能.DateTime内部存储方式.也许可以通过其他方式访问日期部分.你会怎么做?