2014-07-03 125 views
-1

通过使用Buffer.BlockCopy()将原始类型转换为字节很容易。如何将struct数组转换为c#中的字节数组?

但是,如果我有一个DateTime数组,我应该使用哪个函数将DateTime []转换为byte []?

如果我有一个常量大小的结构(这意味着我可以使用Marshal将结构转换为byte []),我应该使用哪种方式将T [](结构数组)转换为byte []?

+2

你想要原始的内存数据吗?或者你想要一些特定的布局/格式? –

+0

http://stackoverflow.com/questions/2274035/how-to-convert-a-byte-into-datetime-in-c,http://stackoverflow.com/questions/7362174/tightest-byte-representation-of -yyyymmddhhmmss,[DateTime.ToBinary](http://msdn.microsoft.com/en-us/library/system.datetime.tobinary(v = vs.110).aspx)。 – CodeCaster

+0

这里不能使用'Marshal',因为'Marshal.SizeOf(typeof(DateTime))'不起作用;再次:你想要的输出是什么? –

回答

4

如果底层内存中表示的副本后,再一种方法是只访问数据unsafe - 是这样的:

// invent some data 
DateTime[] original = new DateTime[10]; 
for (int i = 0; i < original.Length; i++) 
    original[i] = new DateTime(2014, 1, i + 1); 

byte[] blob = new byte[original.Length * sizeof(DateTime)]; 

fixed (DateTime* src = original) 
fixed (byte* dest = blob) 
{ 
    DateTime* typedDest = (DateTime*)dest; 
    for(int i = 0; i < original.Length; i++) 
    { 
     typedDest[i] = src[i]; 
    } 
} 

然而,这是巨大取决于你预计之后的byte[]的内容以及您打算如何处理它。

+0

我想发送很多DateTime []到网络,所以我需要一个快速的方法来做到这一点。 –

+1

@NorSD so ...你的网络协议期望什么?表示刻度的int-32或int-64会不够吗? –

+0

我以前使用的方式是存储[](现在,我们可以使用Buffer.BlockCopy到byte []),它是DateTime.Ticks,并且效果很好。我不知道天气在32/64系统中DateTime的大小是不同的(我认为它总是8个字节)。现在有大量的DateTime [],所以我想找到一种方法来轻松快速地转换它们。在将它们转换为byte []后,我将通过套接字发送到网络。接收器可以是本机C++客户端。 –

相关问题