2010-11-27 83 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; 
} 

當然就會很容易向相反的方向,如果去這是你想要去的方式。

相關問題