[英]Convert fixed size buffer (byte array) to string
我已經在SO和其他論壇上看到了幾個相關的主題,但是找不到我的問題的可行答案。
這是我的代碼:
[StructLayout(LayoutKind.Explicit, Size = 128)]
internal unsafe struct Frame
{
[FieldOffset(0)]
public fixed byte Bytes[128];
[FieldOffset(0)]
public long Low;
[FieldOffset(128 - sizeof(long))]
public long High;
}
unsafe private void button32_Click(object sender, EventArgs e)
{
Frame frame;
// ERROR: Error 15 You cannot use the fixed statement to take the address of an already fixed expression
fixed (byte* ptr = frame.Bytes)
{
}
// ERROR
Console.Write(System.Text.Encoding.ASCII.GetString(frame.Bytes, 0, 128));
frame.Low = 1234;
//Console.Write(System.Text.Encoding.ASCII.GetString(frame.Bytes));
frame.High = 5678;
//Console.Write(System.Text.Encoding.ASCII.GetString(frame.Bytes));
}
static byte[] GetBytes(string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
static string GetString(byte[] bytes)
{
char[] chars = new char[bytes.Length / sizeof(char)];
System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
return new string(chars);
}
static byte[] StringToByteArray(string str, int length)
{
return Encoding.ASCII.GetBytes(str.PadRight(length, ' '));
}
只需將結構包裝到另一個類中即可消除固定指針問題。 這將在新類的內存框架內創建該struct
。 然后將fixed
數組轉換為byte[]
以消除GetString()
問題。 也許有幫助嗎?
namespace test
{
[StructLayout(LayoutKind.Explicit, Size = 128)]
internal unsafe struct Frame
{
[FieldOffset(0)]
public fixed byte Bytes[128];
[FieldOffset(0)]
public long Low;
[FieldOffset(128 - sizeof(long))]
public long High;
}
internal class NewClass
{
public Frame FixedBytesArray;
}
internal class Program
{
static void Main(string[] args)
{
unsafe
{
NewClass NewType = new NewClass();
NewType.FixedBytesArray.High = 12345;
NewType.FixedBytesArray.Low = 6789;
fixed (byte* ptr = NewType.FixedBytesArray.Bytes)
{
byte[] bytes = new byte[128];
int index = 0;
for (byte* counter = ptr; *counter != 0; counter++)
{
bytes[index++] = *counter;
}
Console.Write(System.Text.Encoding.ASCII.GetString(bytes, 0, 128));
}
}
}
}
}
編譯器錯誤很好地說明了這一點:您正在嘗試修復已修復的問題...
僅在分配指針時修復參考。 這樣可以防止將引用移到預期的內存(垃圾回收)中的其他位置,而使用MS字,引用將變為“固定”。
在您的情況下,您無需在定義時修復結構,而是在引用指針時通過應用“ fixed”語句修復“源”(代碼的這一部分是正確的)。
解決方案應該是從結構中刪除修訂語句。 如果您想閱讀有關它的信息: MSDN-固定語句(C#參考)
以上都不適合我,因此我創建了另一個解決方案:
StringBuilder sb = new StringBuilder();
fixed (byte* b = fixedByteArray)
{
for (int i = 0; i < knownLengthOfByteArray; i++)
{
sb.Append((char)b[i]);
}
}
return sb.ToString();
適用於ANSI字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.