고정 바이트/char [100]을 C#에서 관리하는 char []로 변환하는 방법?
-
19-09-2019 - |
문제
고정 바이트 또는 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(); }
}
}
제휴하지 않습니다 StackOverflow