簡體   English   中英

將sbyte []固定為字符串C#

[英]Fixed sbyte[] to string C#

我正在嘗試使用StrucLayoutFieldOffset從內存中獲取字符串

但是我在理解byte如何工作時遇到了很多麻煩。

這是我的代碼ATM:

[StructLayout(LayoutKind.Explicit)]
public unsafe struct InfoDetails
{
    [FieldOffset(0x14)]
    public fixed sbyte Name[50];

    public string getName
    {
        get
        {
            fixed (sbyte* namePtr = Name)
            {
                return new string(namePtr);
            }
        }
    }
}

此代碼returnsT 預期結果是TEZ

關於我為什么做錯了什么建議? 謝謝

您似乎對字符串編碼有問題。 考慮以下測試代碼:

unsafe
{
    InfoDetails d;
    var encoding = Encoding.Unicode;
    var stringBytes = encoding.GetBytes("TEZ");
    for(int i=0; i<stringBytes.Length; i++) d.Name[i] = (sbyte)stringBytes[i];
    Console.WriteLine(d.getName);
}

您的確會得到“ T”,但是如果將編碼更改為Encoding.ASCII ,則會按預期得到“ TEZ”。

解決方案:您需要事先知道信息的編碼,並相應地生成字符串。 看起來像是Unicode,因此請首先嘗試:

fixed (sbyte* namePtr = Name)
{
  return new string(namePtr, 0, 50, Encoding.Unicode);
}

您可以將簽名更改為:

[FieldOffset(0x14)]
public fixed char Name[25];

public string getName
{
    get
    {
        fixed (char* namePtr = Name)
        {
            return new string(namePtr);
        }
    }
}

注意如何將sbyte更改為char並將緩沖區的大小減半(因為sizeof(char) == 2)

或者甚至可以更簡單地向char*添加一個演員表:

fixed (sbyte* namePtr = Name)
{
    return new string((char*)namePtr);
}

無需更改其他任何內容。

感謝大家的回答,他們幫助我找到了可行的解決方案。 我真的不知道這是否是最好的:

[StructLayout(LayoutKind.Explicit)]
    public unsafe struct InfoDetails
    {
        [FieldOffset(0x14)]
        public fixed byte Name[50];

        public string test
        {
            get
            {
                List<byte> clearBytes = new List<byte>();
                fixed (byte* namePtr = Name)
                {
                    for (int i = 0; i < 50; i++)
                    {
                        if (namePtr[i] == 0x0 && namePtr[i + 1] == 0x0)
                        {
                            break;
                        }
                        clearBytes.Add(namePtr[i]);
                    }
                    if (clearBytes.Count() % 2 != 0)
                    {
                        clearBytes.Add(0x00);
                    }
                    return Encoding.Unicode.GetString(clearBytes.ToArray());
                }
            }
        }

    }

非常感謝 !

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM