2010-11-27 79 views
1

请出示优化的解决方案铸件:C#int64列表到字节数组,反之亦然铸造?

1)

public static byte[] ToBytes(List<Int64> list) 
    { 
     byte[] bytes = null; 

     //todo 

     return bytes; 
    } 

2)

public static List<Int64> ToList(byte[] bytes) 
    { 
     List<Int64> list = null; 

     //todo 

     return list; 
    } 

这将是看到以最小化的复制和/或不安全的代码版本非常有帮助的(如果可以实施的话)。理想情况下,根本不需要复制数据。

更新:

我的问题是关于铸像C++方式:

__int64* ptrInt64 = (__int64*)ptrInt8; 

__int8* ptrInt8 = (__int8*)ptrInt64 

感谢您的帮助!

+1

是否要将每个字节转换为Int64(反之亦然)或8个字节的块? (sizeof Int64) – BrokenGlass 2010-11-27 04:45:37

+0

@BrokenGlass我需要将每个8字节(以块为单位)转换为一个Int64值,反之亦然;) – Edward83 2010-11-27 04:48:14

+1

您是要求使用'BitConverter'解决方案还是'memcpy`解决方案? – Gabe 2010-11-27 04:50:14

回答

1

使用Mono.DataConvert。该库具有用于大多数基本类型的转换器,用于大端,小端和主机字节排序。

2

编辑,修正为正确的8字节转换,转换回字节数组时也不是非常有效。

public static List<Int64> ToList(byte[] bytes) 
    { 
     var list = new List<Int64>(); 
     for (int i = 0; i < bytes.Length; i += sizeof(Int64)) 
      list.Add(BitConverter.ToInt64(bytes, i)); 

     return list; 
    } 

    public static byte[] ToBytes(List<Int64> list) 
    { 
     var byteList = list.ConvertAll(new Converter<Int64, byte[]>(Int64Converter)); 
     List<byte> resultList = new List<byte>(); 

     byteList.ForEach(x => { resultList.AddRange(x); }); 
     return resultList.ToArray(); 
    } 

    public static byte[] Int64Converter(Int64 x) 
    { 
     return BitConverter.GetBytes(x); 
    } 
1

CLR数组知道它们的类型和大小,因此您不能只将一个类型的数组转换为另一个类型的数组。但是,可以进行不安全的值类型转换。例如,这里的源BitConverter.GetBytes(long)

public static unsafe byte[] GetBytes(long value) 
{ 
    byte[] buffer = new byte[8]; 
    fixed (byte* numRef = buffer) 
    { 
     *((long*) numRef) = value; 
    } 
    return buffer; 
} 

你可以写这个长材的名单,像这样:

public static unsafe byte[] GetBytes(IList<long> value) 
{ 
    byte[] buffer = new byte[8 * value.Count]; 
    fixed (byte* numRef = buffer) 
    { 
     for (int i = 0; i < value.Count; i++) 
      *((long*) (numRef + i * 8)) = value[i]; 
    } 
    return buffer; 
} 

当然就会很容易向相反的方向,如果去这是你想要去的方式。