none
vb2008二维数组问题。 RRS feed

  • 问题

  • 目前接收到这样的一串数据AA 55 FF FE 64 1D 7D AA 55 FF FE 69 BA 1F AA 55 FF FD 94 4D DC AA 55 00 00 6E 0D 7A AA 55 00 00 14 28 3B AA 55 FF FE D7 31 04 AA 55 FF FC 5B 1D 72 AA 55 FF FD F3 D0 BE AA 55 FF FE 6B 02 69 AA 55 00 01 31 93 C4 AA 55 00 00 A6 03 A8 AA 55 FF FF EB 52 3A AA 55 00 00 80 00 7F AA 55 FF FF 42 B5 F4 AA 55 FF FE 47 8F D2 AA 55 FF FE 8F F1 7C AA 55 00 00 0A EF F8 AA 55 00 00 10 09 18 AA 55 FF FF 68 D4 39 AA 55 FF FD 11 64 70 AA 55 FF FF 8F 10 9C AA 55 FF FD EB CF B5 AA 55 FF FE AE 5F 09 AA 55 FF FD B6 30 E1 AA 55 FF FF 2C 90 B9 AA 55 FF FE 1A 93 A9 AA 55 FF FF 4B EC 34 ……………………

    这数据很长,定义一个二维数组,每行七个字节,比如data(m,0)=AA data (m,1)=55 data (m,2)=FF  data (m,3)=FE data (m,4)=64 data (m,5)=1D data (m,5)=7D   ,首先若满足AA 55开头,并且第7个字节为前面6个字节之和,(即十六进制AA+ 55+ FF+ FE +64 +1D =7D 。7D主要是检测6个数据是否正确,和校验。7D为提取和的低位,去掉溢出的)就把这7个字节存到数组的一行中,否则丢弃。

    对于这样一个没法按行读取,应该如何将符合要求的数据存放到数组中呢?麻烦哪位大神提供一下代码,谢谢!



    2012年5月8日 7:05

答案

  • 对不起,就从你数据来分析,你永远也得不到正确的答案——因为你AA+ 55+ FF+ FE +64 +1D =7D是永远不成立的(正解是:37D)。

    凡是有FF和FE相加的,结果必然不可能小于FF!所以你错了——除非你没有说明清楚(校验和和最后两位,舍去最高位)!

    参考代码,自行根据需要修改(我估计你:AA+ 55+ FF+ FE +64 +1D=7D是:末两位和累加和一样)

    【参考】

    Module A
        Public Sub main()
            Dim s As String = "AA 55 FF FE 64 1D 7D AA 55 FF FE 69 BA 1F AA 55 FF FD 94 4D DC AA 55 00 00 6E 0D 7A AA 55 00 00 14 28 3B AA 55 FF FE D7 31 04 AA 55 FF FC 5B 1D 72 AA 55 FF FD F3 D0 BE AA 55 FF FE 6B 02 69 AA 55 00 01 31 93 C4 AA 55 00 00 A6 03 A8"

            '分裂字符串
            Dim values() As String = s.Split(" ")

            Dim keepvalues As New List(Of List(Of String))()    '考虑动态数组,用List比较好

            Dim sum As Long = 0

            '先保存到动态数组List中
            For index As Integer = 0 To values.Length - 1 Step 7 '头结点开始

                keepvalues.Add(New List(Of String))
                sum = 0

                For subindex As Integer = index To index + 6    '内部循环遍历到尾节点
                    keepvalues(keepvalues.Count - 1).Add(values(subindex))
                Next

            Next

          

            '逐行扫描,剔除不需要的数据
            For i As Integer = 0 To keepvalues.Count - 1
                '条件扫描开始
                If (keepvalues(i)(0) = "AA" AndAlso keepvalues(i)(1) = "55"Then
                    sum = 0   '计数器清空

                    For j = 0 To 5
                            sum += Long.Parse(keepvalues(i)(j), Globalization.NumberStyles.HexNumber)   '求和
                    Next

                    'sum 转化为16进制
                    Dim str As String = Convert.ToString(sum16).ToUpper()

                    If (str.Remove(01) <> keepvalues(i)(6)) Then
                        keepvalues.RemoveAt(i)  '不满足条件,移除
                        i -= 1
                    End If
                Else
                    keepvalues.RemoveAt(i)  '不满足条件,移除
                    i -= 1
                End If
            Next

            '打印数据
            For Each arr In keepvalues
                For Each value In arr
                    Console.Write(value & "  ")
                Next
                Console.WriteLine()
            Next
        End Sub
    End Module

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月8日 7:53
    版主

全部回复

  • 并且第7个字节为前面6个字节之后——什么意思?

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月8日 7:09
    版主
  • 第七个字节为前7个字节之和,即十六进制AA+ 55+ FF+ FE +64 +1D =7D 。7D主要是检测6个数据是否正确,和校验。
    2012年5月8日 7:23
  • 对不起,就从你数据来分析,你永远也得不到正确的答案——因为你AA+ 55+ FF+ FE +64 +1D =7D是永远不成立的(正解是:37D)。

    凡是有FF和FE相加的,结果必然不可能小于FF!所以你错了——除非你没有说明清楚(校验和和最后两位,舍去最高位)!

    参考代码,自行根据需要修改(我估计你:AA+ 55+ FF+ FE +64 +1D=7D是:末两位和累加和一样)

    【参考】

    Module A
        Public Sub main()
            Dim s As String = "AA 55 FF FE 64 1D 7D AA 55 FF FE 69 BA 1F AA 55 FF FD 94 4D DC AA 55 00 00 6E 0D 7A AA 55 00 00 14 28 3B AA 55 FF FE D7 31 04 AA 55 FF FC 5B 1D 72 AA 55 FF FD F3 D0 BE AA 55 FF FE 6B 02 69 AA 55 00 01 31 93 C4 AA 55 00 00 A6 03 A8"

            '分裂字符串
            Dim values() As String = s.Split(" ")

            Dim keepvalues As New List(Of List(Of String))()    '考虑动态数组,用List比较好

            Dim sum As Long = 0

            '先保存到动态数组List中
            For index As Integer = 0 To values.Length - 1 Step 7 '头结点开始

                keepvalues.Add(New List(Of String))
                sum = 0

                For subindex As Integer = index To index + 6    '内部循环遍历到尾节点
                    keepvalues(keepvalues.Count - 1).Add(values(subindex))
                Next

            Next

          

            '逐行扫描,剔除不需要的数据
            For i As Integer = 0 To keepvalues.Count - 1
                '条件扫描开始
                If (keepvalues(i)(0) = "AA" AndAlso keepvalues(i)(1) = "55"Then
                    sum = 0   '计数器清空

                    For j = 0 To 5
                            sum += Long.Parse(keepvalues(i)(j), Globalization.NumberStyles.HexNumber)   '求和
                    Next

                    'sum 转化为16进制
                    Dim str As String = Convert.ToString(sum16).ToUpper()

                    If (str.Remove(01) <> keepvalues(i)(6)) Then
                        keepvalues.RemoveAt(i)  '不满足条件,移除
                        i -= 1
                    End If
                Else
                    keepvalues.RemoveAt(i)  '不满足条件,移除
                    i -= 1
                End If
            Next

            '打印数据
            For Each arr In keepvalues
                For Each value In arr
                    Console.Write(value & "  ")
                Next
                Console.WriteLine()
            Next
        End Sub
    End Module

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月8日 7:53
    版主
  • 是的,是要去掉最高位的。
    2012年5月8日 11:18
  • 是的,是要去掉最高位的。
    参考我的例子,结合你实际情况改进,谢谢。

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月9日 1:00
    版主
  • 嗯,正在修改,谢谢

    2012年5月9日 2:22