2009-07-26 15 views
2

C#에서 고정 바이트 또는 char [100]을 관리 char []로 변환하는 가장 좋은 방법은 무엇입니까? 나는 포인터 연산을 사용하는 것을 끝내었고 더 쉬운 방법이 있는지 궁금해했다. - memcpy 또는 다른 방법과 같은 것?C#에서 고정 바이트/char [100]을 관리 char []로 변환하는 방법?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.InteropServices; 
using System.Text; 

namespace StructTest 
{ 

    [StructLayout(LayoutKind.Explicit)] 
    unsafe struct OuterType 
    { 
     private const int BUFFER_SIZE = 100; 

     [FieldOffset(0)] 
     private int transactionType; 

     [FieldOffset(0)] 
     private fixed byte writeBuffer[BUFFER_SIZE]; 

     public int TransactionType 
     { 
      get { return transactionType; } 
      set { transactionType = value; } 
     } 

     public char[] WriteBuffer 
     { 
      set 
      { 
       char[] newBuffer = value; 

       fixed (byte* b = writeBuffer) 
       { 
        byte* bptr = b; 
        for (int i = 0; i < newBuffer.Length; i++) 
        { 
         *bptr++ = (byte) newBuffer[i]; 
        } 
       } 
      } 

      get 
      { 
       char[] newBuffer = new char[BUFFER_SIZE]; 

       fixed (byte* b = writeBuffer) 
       { 
        byte* bptr = b; 
        for (int i = 0; i < newBuffer.Length; i++) 
        { 
         newBuffer[i] = (char) *bptr++; 
        } 
       } 

       return newBuffer; 
      } 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      OuterType t = new OuterType(); 
      t.WriteBuffer = "hello there".ToCharArray(); 
      System.Console.WriteLine(t.WriteBuffer); 
     } 
    } 
} 

답변

3

Marshal.Copy을 사용할 수 있습니다. 더 적절한 데이터 유형이 될 수있는 byte []에 대해서도 오버로드됩니다.

+0

바이트를 반환하도록 WriteBuffer 속성을 업데이트 한 다음 Marshal.Copy를 사용했습니다. 아마도 byte [] 였을 것입니다. –

0

고정 변수에서 변환하는 더 좋은 방법은 모르겠다. 그러나 이것을 더 단순하게 만드는 한 가지 방법은 고정 된 변수를 모두 사용하지 않는 것입니다. 대신 그런 다음 데이터를 변환하는 간단한 LINQ 쿼리를 사용할 수있는 UnmanagedType.ByValArray

[FieldOffset(0), MarshalAs(UnmanagedType.ByValArray, SizeConst = BUFFER_SIZE)] 
private byte[] writeBuffer; 

으로 정상적인 C#을 배열을 사용하고 표시합니다. 아래의 전체 솔루션

[StructLayout(LayoutKind.Explicit)] 
unsafe struct OuterType 
{ 
    private const int BUFFER_SIZE = 100; 

    [FieldOffset(0)] 
    private int transactionType; 

    [FieldOffset(0), MarshalAs(UnmanagedType.ByValArray, SizeConst = BUFFER_SIZE)] 
    private byte[] writeBuffer; 

    public int TransactionType 
    { 
     get { return transactionType; } 
     set { transactionType = value; } 
    } 

    public char[] WriteBuffer 
    { 
     set { writeBuffer = value.Cast<byte>().ToArray(); } 
     get { return writeBuffer.Cast<char>().ToArray(); } 
    } 
} 
+1

writeBuffer에서 UnmanagedType.ByValArray를 시도했지만 아래처럼 런타임 예외가 발생했습니다. 귀하의 예를 들어 예외가 발생하지 않을까요? 그렇지 않다면 왜 나에게 계몽 할 수 있겠습니까? 처리되지 않은 예외 : System.TypeLoadException : 'StructTest, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null'어셈블리에서 'StructTest.OuterType'형식을로드 할 수 없습니다. 오프셋 0에 개체 필드가 ​​잘못 포함되어 있기 때문에 비 - 객체 필드에 의해 정렬되거나 중첩된다. StructTest.Program.Main (String [] args) –

+0

제한 사항은 내가 구조체를 각각 왜 FieldOffset (0)이 필요한지 조합이되어야한다는 것입니다. –

+0

나는 이것을 시도하고 나는 둘 다 FieldOffset (0)을 가지고 있다면 이전에 주석 처리 한 예외를 얻고있다. –