{"id":1070,"date":"2021-12-02T10:51:08","date_gmt":"2021-12-02T10:51:08","guid":{"rendered":"https:\/\/marketaylor.synology.me\/?p=1070"},"modified":"2022-03-21T09:47:18","modified_gmt":"2022-03-21T09:47:18","slug":"decoding-mqi-constants","status":"publish","type":"post","link":"https:\/\/marketaylor.synology.me\/?p=1070","title":{"rendered":"Decoding MQI constants"},"content":{"rendered":"\n<p>On Twitter, Michael <a href=\"https:\/\/twitter.com\/MichaelDag\/status\/1466028778640007171\" target=\"_blank\" rel=\"noreferrer noopener\">asked<\/a>: &#8220;any logic or hints on how to interpret the PCF parameter names returned as multiples from the com.ibm.mq.headers.pcf?&#8221; Which is a very good question but a proper answer is far too long to type there. There are several different ways that you can approach the problem, depending on what you are trying to do. So this post talks about decoding MQI constants.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>The <em>MQConstants.lookup()<\/em> method in the MQ Java classes knows about all of the definitions in the MQI. Or rather, it discovers all the definitions for itself as it works via reflection. And when you call it, it returns all of the definitions that match a regular expression pattern. For example: <code>MQConstants.lookup(2035,\"MQRC_.*\")<\/code> returns <code>MQRC_NOT_AUTHORIZED<\/code>. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">First know your prefix<\/h3>\n\n\n\n<p>It&#8217;s important when working with decoding that you know which MQI prefix you use to get the value and where different pieces might apply. Most constants are defined such that the first part of the name defines a unique range. The original tweet asked about<\/p>\n\n\n\n<pre id=\"block-f2062ca4-280a-40ed-8d36-69a4821f3cbf\" class=\"wp-block-preformatted\">Parameter : 1 MQIA_APPL_TYPE\/MQIAMO_MONITOR_FLAGS_OBJNAME\/MQIAMO_MONITOR_UNIT<\/pre>\n\n\n\n<p>which suggests that the program calling the lookup method was using a prefix of <code>MQIA<\/code> instead of <code>MQIA_<\/code>. The <code>MQIA<\/code> and <code>MQIAMO<\/code> types of number would be used in different circumstances, and appear in different types or areas of a message.<\/p>\n\n\n\n<p>Some of the prefixes are managed so that even combined they have a unique set of values. The <code>MQIA<\/code>, <code>MQCA<\/code>, <code>MQBA<\/code> are part of a broad set that do not duplicate values across the entire class. That allows us to write code to find an attribute name like<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">s = MQConstants.lookup(v,\"MQIA_.*\");\nif (s == null) s = MQConstants.lookup(v,\"MQCA_.*\");\nif (s == null) s = MQConstants.lookup(v,\"MQBA_.*\");\n...<\/pre>\n\n\n\n<p>On the other hand, there are some groups of constants where the uniqueness is applied to subsets. The prefix in these cases comes from the combination of the first two elements of the definition. For example, the <code>MQTA_PUB<\/code> range overlaps with the <code>MQTA_SUB<\/code> range. There&#8217;s no reliable way to know how these ranges have been allocated, you can only deal with it by testing and reviewing output.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Simplest answer<\/h3>\n\n\n\n<p>The <strong>mqidecode <\/strong>program that&#8217;s part of <a href=\"https:\/\/www.ibm.com\/support\/pages\/ms0p-websphere-mq-explorer-%E2%80%93-extended-management-plug-ins-and-tools\" target=\"_blank\" rel=\"noreferrer noopener\">SupportPac MS0P <\/a>is a very simple wrapper around that method. It automatically adds <code>_<\/code> and the essential <code>.*<\/code> to the given prefix parameter:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ mqidecode -p MQPL -v 1 -e\nMQPL_MVS\/MQPL_OS390\/MQPL_ZOS<\/pre>\n\n\n\n<p>You can see that here we have three &#8220;Platform&#8221; definitions for the same value, added as the branding changed. The Java method returns all of them in a single string but with &#8216;\/&#8217; separators. This particular program does show one way of answering Michael&#8217;s question. It prints out all of the values returned, with just one additional filter. If there is a multi-value response, then it removes any element that I thought would not be particularly helpful:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">if (e.contains(\"_VERSION_\") || e.endsWith(\"_VERSION\"))\ncontinue;\nelse if (e.endsWith(\"_LAST\") || e.endsWith(\"_FIRST\"))\ncontinue;\nelse { ...<\/pre>\n\n\n\n<h5 class=\"wp-block-heading\">Bitfields<\/h5>\n\n\n\n<p>The <strong>mqidecode <\/strong>program can also deal with converting a value into its constituent bitfields. Typically an <em>Options <\/em>field in one of the MQI structures will be an MQLONG (32-bit) integer, with several flags combined into a single number. For example, we can interpret <em>OpenOptions <\/em>(MQOO) values, including some unused bits. The number (not this specific example as it&#8217;s got conflicting settings) might have come from looking at Activity Trace events:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ mqidecode -p MQOO -v 0xffffff -m\n MQOO_INPUT_AS_Q_DEF (0x00000001)\n MQOO_INPUT_SHARED (0x00000002)\n MQOO_INPUT_EXCLUSIVE (0x00000004)\n MQOO_BROWSE (0x00000008)\n MQOO_OUTPUT (0x00000010)\n MQOO_INQUIRE (0x00000020)\n MQOO_SET (0x00000040)\n MQOO_SAVE_ALL_CONTEXT (0x00000080)\n MQOO_PASS_IDENTITY_CONTEXT (0x00000100)\n MQOO_PASS_ALL_CONTEXT (0x00000200)\n MQOO_SET_IDENTITY_CONTEXT (0x00000400)\n MQOO_SET_ALL_CONTEXT (0x00000800)\n MQOO_ALTERNATE_USER_AUTHORITY (0x00001000)\n MQOO_FAIL_IF_QUIESCING (0x00002000)\n MQOO_BIND_ON_OPEN (0x00004000)\n MQOO_BIND_NOT_FIXED (0x00008000)\n MQOO_RESOLVE_NAMES (0x00010000)\n MQOO_CO_OP (0x00020000)\n MQOO_RESOLVE_LOCAL_Q\/MQOO_RESOLVE_LOCAL_TOPIC (0x00040000)\n MQOO_NO_READ_AHEAD (0x00080000)\n MQOO_READ_AHEAD (0x00100000)\n MQOO_NO_MULTICAST (0x00200000)\n MQOO_BIND_ON_GROUP (0x00400000)\n  (0x00800000)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">A slightly more sophisticated approach<\/h3>\n\n\n\n<p>Also in SupportPac MS0P are a bunch of plugins for Explorer that try to format most MQ events. Here, the intention is to make the values more readable, rather than correspond exactly to the spelling of the original definition. I do the same kind of removal as in <strong>mqidecode<\/strong>, but also have some explicit replacements. For example, <code>_Q<\/code> gets replaced by <code>_QUEUE<\/code>. Oddly enough, I can see that I had done something for the exact example given in the question:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">if (p.startsWith(\"MQIAMO\") &amp;&amp; p.contains(\"MONITOR\"))\n  pieces[i] = null;<\/pre>\n\n\n\n<p>I guess that I knew that those definitions were irrelevant in the context where they might be returned. I can also see another replacement to aid readability (the mixture of spaces and underscores was deliberate, based on the phase of decoding I&#8217;d reached during the formatting):<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">if (s.equals(\"Mqca_Base Object Name\/mqca Base Q Name\"))\n  s = \"Mqca_Base Object Name\";<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">The C solution<\/h3>\n\n\n\n<p>For non-Java programmers, there is an alternative way of getting the decoded values which I <a href=\"https:\/\/marketaylor.synology.me\/?p=441\" target=\"_blank\" rel=\"noreferrer noopener\">wrote about<\/a> back in 2015. The <em>cmqstrc.h<\/em> header file contains mapping functions corresponding to the Java lookup method, one function per prefix.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Generating the definItions<\/h4>\n\n\n\n<p>Probably the most pertinent part of this header file in regard to the twitter question is how it gets created. The MQ product source code has all the definitions in a single set of files that is used during the build process to create all the header file or copybook variations for different languages (C, Cobol, RPG etc) and different platforms. So we only have to update a single place when a new constant is added to the specification, and it ensures consistency. <\/p>\n\n\n\n<p>When I added the decoder header file to MQ in version 8, I did it by adding a new component to the generation tool. From the master files, it knows what data to print and in what format. I had to ensure there were no duplicates in the various generated blocks as it uses switch statements and those require uniqueness. Anything using the header file will simply not compile if there are two branches that have the same value. So I made choices &#8211; where there were multiple definitions for the same value in a given range, I picked my favourite. What I thought would be most useful or relevant. For the <strong>mqidecode <\/strong>example earlier, which tries to print the platform value, you will not find <code>MQPL_MVS<\/code> in the <code>MQPL_STR<\/code> function in the published C decoder file. There is only <code>MQPL_ZOS<\/code> to match that number. Though the other variations do appear in the full list structures <code>MQI_BY_VALUE_STR<\/code> and <code>MQI_BY_NAME_STR<\/code> later in the file.<\/p>\n\n\n\n<p>The generation tool has quite a few of these hardcoded choices, along with some other rules. Such as where to use two parts of the definition as the set (prefix) name. Or some definitions that you would never expect to see in program output. Or which cannot be usefully decoded. This is a fragment from the generator program (<code>false<\/code> means that the constant will not appear in <em>cmqstrc.h<\/em>):<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">if (s.equals(\"MQTYPE_LONG\")) {rc = false;}\nif (s.startsWith(\"MQXR2_\") &amp;&amp; !s.equals(\"MQXR2_DEFAULT_CONTINUATION\") &amp;&amp; (v == 0)) {rc = false;}\nif (s.equals(\"MQZCI_DEFAULT\")) {rc = false;}<\/pre>\n\n\n\n<p>A lot of these rules came from iteratively trying them and looking at the output until the code compiled and I was happy with the output. There are other things I&#8217;d like to do with this header file, but it already fulfills its primary requirement.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Using the definitions<\/h4>\n\n\n\n<p>One example of where the C definitions are used is in the <strong>amqsevt <\/strong>sample program. It knows from the context which prefixes are relevant and will do the decoding. It still does some additional reformatting on the definition for readability, such as changing <code>Q<\/code> to <code>QUEUE<\/code>. You can see this processing in the source file. When attributes need to be converted to a JSON format, then this is done very simply after those &#8220;English&#8221; replacements are done &#8211; remove underscores and convert the first letter of the elements so it comes out in camelCase. This simple heuristic means that the JSON names are not guaranteed to be identical to the names used by the <a href=\"https:\/\/www.ibm.com\/docs\/en\/ibm-mq\/9.2?topic=administering-administration-using-rest-api\" target=\"_blank\" rel=\"noreferrer noopener\">REST Admin API<\/a> but they are fairly similar.<\/p>\n\n\n\n<p>The C <em>cmqstrc.h<\/em> header file is also used by my tools that build the MQI interfaces for some other languages &#8211; it constructs the equivalent of the definition files for the Go and NodeJS bindings. Maybe one day I&#8217;ll add those languages to the core generator program but since those language projects work on different schedules than the real product releases, it can be difficult to synchronise the updates.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Warning: amqsrua events are not so easily decodable<\/h3>\n\n\n\n<p>One warning about decoding the MQI constants. You can&#8217;t use <strong>amqsevt <\/strong>or equivalent approaches to work with the queue manager metrics generated through the publish\/subscribe mechanism shown by the <strong>amqsrua <\/strong>sample. <\/p>\n\n\n\n<p>When you try using <strong>amqsevt<\/strong>, you get something that appears to work but actually makes no real sense. The CCSID is obviously not a metric, so that gives a clue that it might be wrong. <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ amqsevt -t \"\\$SYS\/MQ\/INFO\/QMGR\/QM1\/Monitor\/STATMQI\/PUT\" -m QM1\nSample AMQSEVT start\nPress ENTER to end\n\n**** Message #1 (380 Bytes) on Topic $SYS\/MQ\/INFO\/QMGR\/QM1\/Monitor\/STATMQI\/PUT ****\nEvent Type : None [0]\nMessage Type : Statistics [21]\nReason : None [0]\nEvent created : 2021\/12\/02 10:32:24.51 GMT\nQueue Mgr Name : QM1\nMonitor Class : 2\nMonitor Type : 3\nMonitor Interval : 2989229\nMonitor Flags None : 182\nAppl Type : 57916\nCoded Char Set Id   : 182\nCurrent Queue Depth : 0\n...<\/pre>\n\n\n\n<p>That&#8217;s because the &#8220;numbers&#8221; in the generated events are not MQI constants representing attributes, but keys to data maps returned by metadata queries (see the amqsrua source code to understand how that works).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Summary<\/h3>\n\n\n\n<p>This is a lot longer than twitter would allow to answer what looks like a simple question. <\/p>\n\n\n\n<p>And a short answer could be a) live with it b) do some very simple eliminations c) do a lot more handcrafted work. But I hope it gives interesting background and some ideas on how you might work with MQI decoding.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Update History<\/h5>\n\n\n\n<ul class=\"wp-block-list\"><li>2021-12-10: Initial publication<\/li><li>2021-12-15: Add section about bitfield decoding<\/li><\/ul>\n<p class=\"last-modified\" style=\"border:1px solid;padding: 10px;\">This post was last updated on March 21st, 2022 at 09:47 am<\/p>","protected":false},"excerpt":{"rendered":"<p>On Twitter, Michael asked: &#8220;any logic or hints on how to interpret the PCF parameter names returned as multiples from the com.ibm.mq.headers.pcf?&#8221; Which is a very good question but a proper answer is far too long to type there. There are several different ways that you can approach the problem, depending on what you are &hellip; <a href=\"https:\/\/marketaylor.synology.me\/?p=1070\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Decoding MQI constants&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[5],"tags":[41,35,47,106,20,107],"class_list":["post-1070","post","type-post","status-publish","format-standard","hentry","category-mq","tag-events","tag-ibmmq","tag-java","tag-mqi","tag-mqseries","tag-programming"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Decoding MQI constants - Mark Taylor&#039;s Blog<\/title>\n<meta name=\"description\" content=\"This post contains some advice on how to write programs for decoding MQI constants that might match several definitions\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/marketaylor.synology.me\/?p=1070\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Decoding MQI constants - Mark Taylor&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"This post contains some advice on how to write programs for decoding MQI constants that might match several definitions\" \/>\n<meta property=\"og:url\" content=\"https:\/\/marketaylor.synology.me\/?p=1070\" \/>\n<meta property=\"og:site_name\" content=\"Mark Taylor&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-12-02T10:51:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-03-21T09:47:18+00:00\" \/>\n<meta name=\"author\" content=\"Mark\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@marketaylor\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mark\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1070#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1070\"},\"author\":{\"name\":\"Mark\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#\\\/schema\\\/person\\\/2d6f4113ff54187023e20c20186bbb3c\"},\"headline\":\"Decoding MQI constants\",\"datePublished\":\"2021-12-02T10:51:08+00:00\",\"dateModified\":\"2022-03-21T09:47:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1070\"},\"wordCount\":1407,\"commentCount\":0,\"keywords\":[\"events\",\"ibmmq\",\"java\",\"mqi\",\"mqseries\",\"programming\"],\"articleSection\":[\"IBM MQ\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1070#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1070\",\"url\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1070\",\"name\":\"Decoding MQI constants - Mark Taylor&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#website\"},\"datePublished\":\"2021-12-02T10:51:08+00:00\",\"dateModified\":\"2022-03-21T09:47:18+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#\\\/schema\\\/person\\\/2d6f4113ff54187023e20c20186bbb3c\"},\"description\":\"This post contains some advice on how to write programs for decoding MQI constants that might match several definitions\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1070#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1070\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1070#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/marketaylor.synology.me\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Decoding MQI constants\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#website\",\"url\":\"https:\\\/\\\/marketaylor.synology.me\\\/\",\"name\":\"Mark Taylor&#039;s Blog\",\"description\":\"Messaging, Music and Moving Around\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/marketaylor.synology.me\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#\\\/schema\\\/person\\\/2d6f4113ff54187023e20c20186bbb3c\",\"name\":\"Mark\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g\",\"caption\":\"Mark\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/marketaylor\"],\"url\":\"https:\\\/\\\/marketaylor.synology.me\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Decoding MQI constants - Mark Taylor&#039;s Blog","description":"This post contains some advice on how to write programs for decoding MQI constants that might match several definitions","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/marketaylor.synology.me\/?p=1070","og_locale":"en_GB","og_type":"article","og_title":"Decoding MQI constants - Mark Taylor&#039;s Blog","og_description":"This post contains some advice on how to write programs for decoding MQI constants that might match several definitions","og_url":"https:\/\/marketaylor.synology.me\/?p=1070","og_site_name":"Mark Taylor&#039;s Blog","article_published_time":"2021-12-02T10:51:08+00:00","article_modified_time":"2022-03-21T09:47:18+00:00","author":"Mark","twitter_card":"summary_large_image","twitter_creator":"@marketaylor","twitter_misc":{"Written by":"Mark","Estimated reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/marketaylor.synology.me\/?p=1070#article","isPartOf":{"@id":"https:\/\/marketaylor.synology.me\/?p=1070"},"author":{"name":"Mark","@id":"https:\/\/marketaylor.synology.me\/#\/schema\/person\/2d6f4113ff54187023e20c20186bbb3c"},"headline":"Decoding MQI constants","datePublished":"2021-12-02T10:51:08+00:00","dateModified":"2022-03-21T09:47:18+00:00","mainEntityOfPage":{"@id":"https:\/\/marketaylor.synology.me\/?p=1070"},"wordCount":1407,"commentCount":0,"keywords":["events","ibmmq","java","mqi","mqseries","programming"],"articleSection":["IBM MQ"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/marketaylor.synology.me\/?p=1070#respond"]}]},{"@type":"WebPage","@id":"https:\/\/marketaylor.synology.me\/?p=1070","url":"https:\/\/marketaylor.synology.me\/?p=1070","name":"Decoding MQI constants - Mark Taylor&#039;s Blog","isPartOf":{"@id":"https:\/\/marketaylor.synology.me\/#website"},"datePublished":"2021-12-02T10:51:08+00:00","dateModified":"2022-03-21T09:47:18+00:00","author":{"@id":"https:\/\/marketaylor.synology.me\/#\/schema\/person\/2d6f4113ff54187023e20c20186bbb3c"},"description":"This post contains some advice on how to write programs for decoding MQI constants that might match several definitions","breadcrumb":{"@id":"https:\/\/marketaylor.synology.me\/?p=1070#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/marketaylor.synology.me\/?p=1070"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/marketaylor.synology.me\/?p=1070#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/marketaylor.synology.me\/"},{"@type":"ListItem","position":2,"name":"Decoding MQI constants"}]},{"@type":"WebSite","@id":"https:\/\/marketaylor.synology.me\/#website","url":"https:\/\/marketaylor.synology.me\/","name":"Mark Taylor&#039;s Blog","description":"Messaging, Music and Moving Around","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/marketaylor.synology.me\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Person","@id":"https:\/\/marketaylor.synology.me\/#\/schema\/person\/2d6f4113ff54187023e20c20186bbb3c","name":"Mark","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g","caption":"Mark"},"sameAs":["https:\/\/x.com\/marketaylor"],"url":"https:\/\/marketaylor.synology.me\/?author=1"}]}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/posts\/1070","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1070"}],"version-history":[{"count":10,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/posts\/1070\/revisions"}],"predecessor-version":[{"id":1216,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/posts\/1070\/revisions\/1216"}],"wp:attachment":[{"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1070"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1070"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1070"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}