亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

固定 sbyte[] 到字符串 C#

固定 sbyte[] 到字符串 C#

C#
米琪卡哇伊 2021-06-17 15:01:22
我正在嘗試使用StrucLayout和從內存中獲取字符串FieldOffset但是我在理解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);            }        }    }}此代碼returns:T。預期結果是TEZ。關于我為什么做錯的任何建議?謝謝
查看完整描述

3 回答

?
慕沐林林

TA貢獻2016條經驗 獲得超9個贊

您似乎對字符串編碼有問題??紤]以下測試代碼:


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);

}


查看完整回答
反對 回復 2021-06-20
?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

他們幫助我找到了一個可行的解決方案。我真的不知道它是否是最好的:


[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());

                }

            }

        }


    }


查看完整回答
反對 回復 2021-06-20
  • 3 回答
  • 0 關注
  • 344 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號