为了账号安全,请及时绑定邮箱和手机立即绑定

固定 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 关注
  • 295 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信