【问题标题】:How to print field of an ASN.1 UPER message field in C?如何在 C 中打印 ASN.1 UPER 消息字段的字段?
【发布时间】:2021-10-03 22:43:12
【问题描述】:

我收到以下消息。这是在https://asn1.io/asn1playground/ 上创建的基本 ASN.1 Uper 消息。我想使用单个字段进行操作。例如我想打印协议版本。我能怎么做?我可以写 DENM.header.protocol 版本吗?我真的不知道:

value1 DENM ::= {
  header {
    protocolVersion 1,
    messageID denm,
    stationID 1234567
  },
  denm {
    management {
      actionID {
        originatingStationID 20,
        sequenceNumber 30
      },
      detectionTime 45000000000,
      referenceTime oneMillisecAfterUTCStartOf2004,
      eventPosition {
        latitude 40487111,
        longitude -79494789,
        positionConfidenceEllipse {
          semiMajorConfidence 500,
          semiMinorConfidence 400,
          semiMajorOrientation 10
        },
        altitude {
          altitudeValue 2000,
          altitudeConfidence alt-000-02
        }
      },
      validityDuration 600,
      transmissionInterval oneMilliSecond,
      stationType unknown
    },
    situation {
      informationQuality lowest,
      eventType {
        causeCode roadworks,
        subCauseCode 0
      }
    },
    location {
      eventSpeed {
        speedValue standstill,
        speedConfidence equalOrWithinOneCentimeterPerSec
      },
      eventPositionHeading {
        headingValue wgs84North,
        headingConfidence equalOrWithinOneDegree
      },
      traces {
        {
          {
            pathPosition {
              deltaLatitude 20,
              deltaLongitude 20,
              deltaAltitude unavailable
            },
            pathDeltaTime tenMilliSecondsInPast
          },
          {
            pathPosition {
              deltaLatitude 22,
              deltaLongitude 22,
              deltaAltitude unavailable
            }
          }
        }
      },
      roadType urban-NoStructuralSeparationToOppositeLanes
    },
    alacarte {
      impactReduction {
        heightLonCarrLeft oneCentimeter,
        heightLonCarrRight oneCentimeter,
        posLonCarrLeft oneCentimeter,
        posLonCarrRight oneCentimeter,
        positionOfPillars {
          tenCentimeters
        },
        posCentMass unavailable,
        wheelBaseVehicle tenCentimeters,
        turningRadius point4Meters,
        posFrontAx tenCentimeters,
        positionOfOccupants '11111110000000100001'B,
        vehicleMass 20,
        requestResponseIndication response
      },
      externalTemperature oneDegreeCelsius,
      roadWorks {
        lightBarSirenInUse '11'B,
        closedLanes {
          innerhardShoulderStatus availableForStopping,
          drivingLaneStatus '011'B
        },
        restriction {
          unknown
        },
        speedLimit 20,
        incidentIndication {
          causeCode reserved,
          subCauseCode 0
        },
        recommendedPath {
          {
            latitude 20,
            longitude 20,
            positionConfidenceEllipse {
              semiMajorConfidence oneCentimeter,
              semiMinorConfidence oneCentimeter,
              semiMajorOrientation wgs84North
            },
            altitude {
              altitudeValue 200,
              altitudeConfidence alt-000-02
            }
          }
        }
      },
      positioningSolution noPositioningSolution,
      stationaryVehicle {
        stationarySince equalOrGreater15Minutes,
        stationaryCause {
          causeCode roadworks,
          subCauseCode 0
        },
        numberOfOccupants 30,
        vehicleIdentification {
          wMInumber "WVW",
          vDS "ZZZ1JZ"
        },
        energyStorageType '0000010'B
      }
    }
  }
}

如何在 C 中打印“协议版本”字段?感谢您的帮助!

【问题讨论】:

  • This is a basic ASN.1 Uper message 您是如何用 C 编程语言 表示此消息的? How can I do? 请更具体。您是在问如何打印整数值1?您是否在问如何根据 ASN.1 规范解析字节流? Can I write DENM.header.protocol versione? 您可以使用 C 编程语言进行编程,并创建一个抽象的程序,以便您可以在该程序中编写它。 How can I print in C the field "PROTOCOL VERSION"?你试过什么?你知道如何启动一个 C 程序吗?请参阅How to Ask
  • 一种方法是找到一些 ASN.1 到 C 编译器,该编译器创建数据结构和函数来处理 ASN.1 数据。然后,您将拥有一组函数来解析 ASN.1 数据并提取您需要的字段。但这对于关于 SO 的问题来说有点过于宽泛了。搜索这样的编译器/转换器,查看教程,如果您有具体问题,请回来再问一个问题。
  • 我将其表示为十六进制字符串。所以我的问题是:从这个十六进制字符串中,我可以提取一个字段吗?我只有一个十六进制字符串。
  • 您可能需要先将字符串转换为原始数据。然后由 ASN.1 到 C 编译器创建的函数应该解析这些数据。
  • 顺便说一句:当然,您的协议需要 ASN.1 格式规范才能将其输入 ASN.1 到 C 编译器。并且 ASN.1 到 C 编译器必须支持正确的编码格式。

标签: c printf decode encode asn.1


【解决方案1】:

该网站具有三个基本区域。左侧是您的架构所在的位置。中间区域是您放置问题中包含的 ASN.1 值的位置。右侧是网站输出 ASN.1 可以为该 ASN.1 值创建的各种不同线路格式(或编码)的位置。十六进制只是呈现为十六进制数字对的二进制输出。

您需要做的是使用您自己的 ASN.1 编译器来编译架构,例如 this one。这将为您提供大量 C 源代码,其中一些是编译器的库代码,还有一些是它生成的以将您的模式表示为 C 结构的层次结构。那里将有一个例程,用于从包含该 ASN.1 值的 uPER 编码的二进制文件中解码 DENM。

一旦掌握了窍门,编写一个程序来调用该 DENM uPER 解码器,然后 printf("%i\n",denm.header.protocolVersion); 就很简单了。

【讨论】:

    猜你喜欢
    • 2013-03-13
    • 2023-01-09
    • 1970-01-01
    • 2015-01-19
    • 2014-04-12
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2013-03-16
    相关资源
    最近更新 更多