【问题标题】:Fixed length strings or structures in C#C# 中的固定长度字符串或结构
【发布时间】:2009-01-06 02:23:09
【问题描述】:

我需要为我正在处理的项目创建一个长度固定的结构或一系列字符串。目前它是用 COBOL 编写的,是一个通信应用程序。它通过网络发送一个固定长度的记录并接收一个固定长度的记录。为了简单起见,我想把它写成一个结构,但到目前为止,我发现最好的方法是使用 string.padright 将字符串终止符放在正确的位置。

我可以写一个类来封装这个并返回一个固定长度的字符串,但我希望找到一种简单的方法来填充结构并将其用作固定长度的记录。

编辑--

固定长度记录在 URL 中用作参数,因此它的 http:\somewebsite.com\parseme?record="firstname lastname address city state zip"。我很确定我不必担心 ascii 到 unicode 的转换,因为它在 url 中。它比那个大一点,传递的信息比地址多,大约 30 或 35 个字段。

【问题讨论】:

    标签: c# .net vb.net


    【解决方案1】:

    将 MarshalAs 标签添加到您的结构中。这是一个例子:

    <StructLayout (LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
    Public Structure OSVERSIONINFO
        Public dwOSVersionInfoSize As Integer
        Public dwMajorVersion As Integer
        Public dwMinorVersion As Integer
        Public dwBuildNumber As Integer
        Public dwPlatformId As Integer
    
        <MarshalAs (UnmanagedType.ByValTStr, SizeConst:=128)> _
        Public szCSDVersion As String
    End Structure
    

    http://bytes.com/groups/net-vb/369711-defined-fixed-length-string-structure

    【讨论】:

    • MarshalAs 用于与 PInvoke(非托管代码)进行互操作。由于似乎 OP 在向 Web 发出请求之前一直停留在托管代码中,因此它永远不会被编组。
    【解决方案2】:

    您可以使用 VB6 compat FixedLengthString 类,但编写自己的类非常简单。

    如果您需要解析和验证以及所有有趣的东西,您可能想看看FileHelpers,它使用annotate and parse fixed length records 的属性。

    FWIW,在任何相对琐碎的事情(例如数据处理)上,我可能只使用 ToFixedLength() 扩展方法,该方法在写出记录时根据需要处理填充或截断。对于更复杂的事情(如验证或解析),我会求助于 FileHelpers。

    【讨论】:

      【解决方案3】:
      byte[] arrayByte = new byte[35];
      
      // Fill arrayByte with the other function
      
      //Convert array of byte to string chain
      string arrayStringConverr = Encoding.ASCII.GetString(arrayByte, 0, arrayByte.Length);
      

      【讨论】:

        【解决方案4】:

        作为答案,您应该能够使用正确大小的 char 数组,而无需编组。

        此外,.net 中的类和结构之间的差异很小。结构不能为空,而类可以。否则它们的用途和功能几乎相同。

        最后,听起来您应该注意正在发送的字符的大小。我假设(我知道,我知道)COBOL 使用 8 位 ASCII 字符,而 .net 字符串将使用 UTF-16 编码字符集。这意味着 COBOL 中 10 个字符的字符串是 10 个字节,但在 .net 中,相同的字符串是 20 个字节。

        【讨论】:

        • “.net 中的类和结构之间的差异很小。结构不能为空,而类可以。否则它们的用途和功能几乎相同。”很抱歉我是一个消极的南希,但这是非常错误的。
        猜你喜欢
        • 1970-01-01
        • 2011-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-27
        • 2020-01-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多