문제

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

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);
        }
    }
}
도움이 되었습니까?

해결책

당신이 사용할 수있는 마샬 그에 대한. 바이트 []에 대해서도 더 적절한 데이터 유형 일 수 있습니다.

다른 팁

고정 변수에서 변환을 수행하는 더 좋은 방법을 모릅니다. 그러나 이것을 더 간단하게 만드는 한 가지 방법은 고정 변수의 사용을 완전히 피하는 것입니다. 대신 일반 C# 배열을 사용하여 UnmanagedType.ByValArray로 표시하십시오.

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

그런 다음 간단한 LINQ 쿼리를 사용하여 데이터를 변환 할 수 있습니다. 아래의 전체 솔루션

[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(); }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top