封送不正确的整数值
本文关键字:整数 不正确 | 更新日期: 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
的二进制表示相同。
我建议您构建自己的解析器,这不是使用封送处理的任务。