封送不正确的整数值

本文关键字:整数 不正确 | 更新日期: 2023-09-27 18:27:31

我正在尝试开发一个程序,将任何字符串解析为给定的固定字符长度。

我决定使用封送处理,而不是编写自己的解析器类。如下所示,我定义了一个结构:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct MyStruct
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
    public string Name;              
    [MarshalAs(UnmanagedType.I4, SizeConst = 2)]
    public int Age;              
}

我这样调用这个结构;

string message = "SampleName30";
IntPtr pBuf = Marshal.StringToBSTR(message);
MyStruct ms = (MyStruct)Marshal.PtrToStructure(pBuf, typeof(MyStruct));

如果我检查值:

ms.Name is SampleName // OK

但是ms.Age值返回3145779。我期待ms.Age = 30

怎么了?如何解决此问题?

封送不正确的整数值

这是你搞得一团糟。

第一件事是第一位的。3145779是十六进制的300033。'3'在十六进制中是33,'0'在十六进制为30,加上一些unicode和endianes,你就会得到300033(我没有完全复制这个,因为它在这里并不重要)。

您不能用这种方式将字符串转换为数字,您需要对其进行解码-将每个数字字符转换为其数值。

为什么要用这种方式解析字符串?使用这个代码不是更好吗:

struct MyStruct
{
    public string Name;
    public int Age;
    public static MyStruct ParseString(string s)
    {
        var my = new MyStruct();
        Name = s.substring(0, 10);
        Age = int.Parse(s.substring(11))
    }
}

你应该让接口更整洁一点(属性?一个构造函数而不是Parse方法?),并处理错误(更短或更长的字符串,无效的整数),但这就是jist。

原因是您有一个字符串"30",而不是整数30。unicode字符串"30"的二进制表示与数字3145779的二进制表示相同。

我建议您构建自己的解析器,这不是使用封送处理的任务。