どのようにC#で管理するのchar []に固定されたバイト/文字[100]を変換するには?

StackOverflow https://stackoverflow.com/questions/1185269

質問

C#での管理のchar []に固定されたバイトまたはchar [100]を変換するための最良の方法は何ですか?私は、ポインタ演算を使用するようになってしまったともっと簡単な方法があれば、私は思ったんだけど - ?の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);
        }
    }
}
役に立ちましたか?

解決

あなたはそのために Marshal.Copy に使用することができます。それはまた、より適切なデータ型であるかもしれないバイト[]、オーバーロードされて注意してください。

他のヒント

私は、固定された変数の変換を行うには良い方法を知りません。しかし、これを簡単にするための1つの方法は完全に固定変数の使用を避けることです。代わりに、通常の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