【发布时间】: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