# How to decode 16 bit unsigned integer

**URL:** <https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114>\
**Category:** General\
**Created:** [27 December 2020 21:57 UTC](https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114 "2020-12-27T21:57:15Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![oliver.es](https://avatars.discourse-cdn.com/v4/letter/o/dc4da7/32.png) [@oliver.es](https://discourse.nodered.org/u/oliver.es)\
**Post date:** [27 December 2020 21:57 UTC](https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114/1 "2020-12-27T21:57:15Z")

</div>

Hi, I found a solution in [this post](https://discourse.nodered.org/t/modbus-16bit-signed-integer/25362/6) by @Colin to decode 16 bit SIGNED integer, but I have in Modbus register voltage values as 16 bit UNSIGNED integer.

If this `msg.payload[22] = (msg.payload[22] << 16) >> 16` works to 16bit SIGNED, how to convert 16bit UNSIGNED?

Thanks

---

<div class="post-metadata">

**Author:** ![Colin](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/colin/32/17040_2.png) [@Colin](https://discourse.nodered.org/u/Colin)\
**Post date:** [27 December 2020 22:10 UTC](https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114/2 "2020-12-27T22:10:20Z")

</div>

If it is an unsigned integer then you don't need to do anything at all.

However, for modbus buffer decoding I recommend node-red-contrib-buffer-parser which will probably do everything you need, and more.

---

<div class="post-metadata">

**Author:** ![oliver.es](https://avatars.discourse-cdn.com/v4/letter/o/dc4da7/32.png) [@oliver.es](https://discourse.nodered.org/u/oliver.es)\
**Post date:** [27 December 2020 22:36 UTC](https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114/3 "2020-12-27T22:36:34Z")

</div>

I need to divide by 10, because decimal is missing. OK, thank you.

What about 32 bit signed? `msg.payload[26] = (msg.payload[26] << 32) >> 32` ?

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [27 December 2020 23:09 UTC](https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114/4 "2020-12-27T23:09:25Z")

</div>

You should use [node-red-contrib-buffer-parser]("node-red-contrib-buffer-parser (node) - Node-RED" [https://flows.nodered.org/node/node-red-contrib-buffer-parser](https://flows.nodered.org/node/node-red-contrib-buffer-parser)). It does all of this and more. It was designed for this.

Search the forum for a taste of the problems it has solved.

---

<div class="post-metadata">

**Author:** ![oliver.es](https://avatars.discourse-cdn.com/v4/letter/o/dc4da7/32.png) [@oliver.es](https://discourse.nodered.org/u/oliver.es)\
**Post date:** [28 December 2020 00:14 UTC](https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114/5 "2020-12-28T00:14:51Z")

</div>

Buffer parser is little complex and difficult for my use. I'm using modbustcp node to read 126 registers from the Solax inverter. Some registers are in 16-bit signed, some 16-bit unsigned, and some 32-bit signed.

Look at the screen, I have an array with all values. I cannot address [22] with "length" and "offset" in parser UI. Please advise.

 ![Snímek obrazovky 2020-12-28 v 1.08.30](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/4/6/46a6fa9bda5b1b0df4c885119d08512721d0b297.png)  
...  
 ![Snímek obrazovky 2020-12-28 v 1.16.27](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/e/7/e7ceb2ecdb4d682d88437bef43645feb2a999d9d.png)

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [28 December 2020 00:21 UTC](https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114/6 "2020-12-28T00:21:46Z")

</div>

Read the built in help and read some of the posts in the forum. It's not too difficult to get your head around, but once you do, it will greatly simplify your solution.

1 thing, attach a debug node (set to show full message) to the output of your modbustcp node. Expand the `msg` object until you find the buffer (msg.reponsedata.buffer or something like that), use that as the property (instead of msg.payload)

Read the buffer-parser built in help. it clearly explains what length, offset, and other fields are

---

<div class="post-metadata">

**Author:** ![oliver.es](https://avatars.discourse-cdn.com/v4/letter/o/dc4da7/32.png) [@oliver.es](https://discourse.nodered.org/u/oliver.es)\
**Post date:** [28 December 2020 00:44 UTC](https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114/7 "2020-12-28T00:44:58Z")

</div>

Yes, I have read help, but I can't understand it. I'm sending a whole message to the parser and on the output I have a complete array (0-126) but the numbers are damaged, maybe converted, so they do not make sense.

If I display complete msg object from modbustcp on debug node, I don't have msg.reponsedata.buffer or something like that. There is only an array.

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [28 December 2020 00:46 UTC](https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114/8 "2020-12-28T00:46:17Z")

</div>

Are you certain the debug is set to show complete message?

Can you show me a screen shot please?

---

<div class="post-metadata">

**Author:** ![oliver.es](https://avatars.discourse-cdn.com/v4/letter/o/dc4da7/32.png) [@oliver.es](https://discourse.nodered.org/u/oliver.es)\
**Post date:** [28 December 2020 00:50 UTC](https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114/9 "2020-12-28T00:50:37Z")

</div>

![Snímek obrazovky 2020-12-28 v 1.49.47](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/5/e/5e7368ae8b5f2bb2e28cf36daa8ea493b724cbe6.png)

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [28 December 2020 01:00 UTC](https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114/10 "2020-12-28T01:00:06Z")

</div>

Hmmm odd. Normally much more in the message than that for the modbus nodes.

Anyhow, I will try to provide you some better advise & a demo in the morning, but in the mean time, could you copy that array (using the copy button that appears under your mouse when you hover over debug message) and provide a few other details...

- What the values are supposed to be (just a few of them)
- names
- data types
- expected values  
... And I'll set it up as a demo to show you how to arrange things.

---

<div class="post-metadata">

**Author:** ![UnborN](https://avatars.discourse-cdn.com/v4/letter/u/4491bb/32.png) [@UnborN](https://discourse.nodered.org/u/UnborN)\
**Post date:** [28 December 2020 01:20 UTC](https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114/11 "2020-12-28T01:20:00Z")

</div>

Hi Oliver,

Because you are using the **node-red-contrib-modbustcp** node and this node apparently doesnt reply with the buffer of the values.

Is it easy to replace that node with **[node-red-contrib-modbus](https://flows.nodered.org/node/node-red-contrib-modbus)**?  
They work more or less the same way but with more features.

It will be much easier to use this set of nodes with Buffer-parser.

---

<div class="post-metadata">

**Author:** ![oliver.es](https://avatars.discourse-cdn.com/v4/letter/o/dc4da7/32.png) [@oliver.es](https://discourse.nodered.org/u/oliver.es)\
**Post date:** [28 December 2020 09:23 UTC](https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114/12 "2020-12-28T09:23:16Z")

</div>

Here is complete message copied from Nodered. [https://pastebin.com/yCGj7FU2](https://pastebin.com/yCGj7FU2)

Let's look at Batter power in register [22] that is 16 bit signed. Expected decoded value is about -27W, because battery is discharging. If battery is charging, there will be positive value with max value about 6300W.

If you want to look on details and other registers, source is here: [https://github.com/InfernoEmbedded/PowerScraper/blob/8d261ddcbaeee8d23c75c0a30d9d98a88fa319f8/Inputs/SolaxModbus.py](https://github.com/InfernoEmbedded/PowerScraper/blob/8d261ddcbaeee8d23c75c0a30d9d98a88fa319f8/Inputs/SolaxModbus.py)

---

<div class="post-metadata">

**Author:** ![oliver.es](https://avatars.discourse-cdn.com/v4/letter/o/dc4da7/32.png) [@oliver.es](https://discourse.nodered.org/u/oliver.es)\
**Post date:** [28 December 2020 09:27 UTC](https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114/13 "2020-12-28T09:27:52Z")

</div>

I tried more nodes, but no other could connect to the IP address of the inverter.

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [28 December 2020 10:15 UTC](https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114/14 "2020-12-28T10:15:39Z")

</div>

Do these payload values look right?  
 ![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/5/9/59a646346b695f89de2c8294c7c818adb7fd9902.png)

 ![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/4/7/47e92f4f55c610ffb386bef2c90ef575eea8896e.png)

Demo flow...

```auto
[{"id":"3cdc61d2.9d548e","type":"inject","z":"f77cda4d.5d7628","name":"go","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":1050,"y":80,"wires":[["7d72ded.8fbf02"]]},{"id":"7d72ded.8fbf02","type":"function","z":"f77cda4d.5d7628","name":"modbus msg","func":"\nreturn { \"settings\": { \"name\": \"Solax\", \"topic\": \"Solax\", \"adr\": \"0\", \"quantity\": \"126\", \"dataType\": \"InputRegister\", \"ieeeType\": \"off\", \"ieeeBE\": true, \"timerID\": { \"_idleTimeout\": 5000, \"_idlePrev\": { \"_idleNext\": \"[Circular ~.settings.timerID]\", \"_idlePrev\": { \"_idleTimeout\": 5000, \"_idlePrev\": { \"_idleTimeout\": 5000, \"_idlePrev\": { \"_idleTimeout\": 5000, \"_idlePrev\": { \"_idleTimeout\": 5000, \"_idlePrev\": { \"_idleTimeout\": 5000, \"_idlePrev\": { \"_idleTimeout\": 5000, \"_idlePrev\": \"[Circular ~.settings.timerID]\", \"_idleNext\": \"[Circular ~.settings.timerID._idlePrev._idlePrev._idlePrev._idlePrev._idlePrev._idlePrev]\", \"_idleStart\": 43475234, \"_repeat\": null, \"_destroyed\": false }, \"_idleNext\": \"[Circular ~.settings.timerID._idlePrev._idlePrev._idlePrev._idlePrev._idlePrev]\", \"_idleStart\": 43475233, \"_repeat\": null, \"_destroyed\": false }, \"_idleNext\": \"[Circular ~.settings.timerID._idlePrev._idlePrev._idlePrev._idlePrev]\", \"_idleStart\": 43475232, \"_repeat\": null, \"_destroyed\": false }, \"_idleNext\": \"[Circular ~.settings.timerID._idlePrev._idlePrev._idlePrev]\", \"_idleStart\": 43475231, \"_repeat\": null, \"_destroyed\": false }, \"_idleNext\": \"[Circular ~.settings.timerID._idlePrev._idlePrev]\", \"_idleStart\": 43475230, \"_repeat\": null, \"_destroyed\": false }, \"_idleNext\": \"[Circular ~.settings.timerID._idlePrev]\", \"_idleStart\": 43475229, \"_repeat\": null, \"_destroyed\": false }, \"expiry\": 43480229, \"id\": -9007199254620531, \"msecs\": 5000, \"priorityQueuePosition\": 17 }, \"_idleNext\": { \"_idleTimeout\": 5000, \"_idlePrev\": \"[Circular ~.settings.timerID]\", \"_idleNext\": { \"_idleTimeout\": 5000, \"_idlePrev\": \"[Circular ~.settings.timerID._idleNext]\", \"_idleNext\": { \"_idleTimeout\": 5000, \"_idlePrev\": \"[Circular ~.settings.timerID._idleNext._idleNext]\", \"_idleNext\": { \"_idleTimeout\": 5000, \"_idlePrev\": \"[Circular ~.settings.timerID._idleNext._idleNext._idleNext]\", \"_idleNext\": { \"_idleTimeout\": 5000, \"_idlePrev\": \"[Circular ~.settings.timerID._idleNext._idleNext._idleNext._idleNext]\", \"_idleNext\": { \"_idleTimeout\": 5000, \"_idlePrev\": \"[Circular ~.settings.timerID._idleNext._idleNext._idleNext._idleNext._idleNext]\", \"_idleNext\": { \"_idleNext\": \"[Circular ~.settings.timerID]\", \"_idlePrev\": \"[Circular ~.settings.timerID._idleNext._idleNext._idleNext._idleNext._idleNext._idleNext]\", \"expiry\": 43480229, \"id\": -9007199254620531, \"msecs\": 5000, \"priorityQueuePosition\": 17 }, \"_idleStart\": 43475229, \"_repeat\": null, \"_destroyed\": false }, \"_idleStart\": 43475230, \"_repeat\": null, \"_destroyed\": false }, \"_idleStart\": 43475231, \"_repeat\": null, \"_destroyed\": false }, \"_idleStart\": 43475232, \"_repeat\": null, \"_destroyed\": false }, \"_idleStart\": 43475233, \"_repeat\": null, \"_destroyed\": false }, \"_idleStart\": 43475234, \"_repeat\": null, \"_destroyed\": false }, \"_idleStart\": 43479503, \"_repeat\": 5000, \"_destroyed\": false } }, \"topic\": \"Solax\", \"payload\": [0, 0, 0, 2841, 2239, 0, 0, 0, 40, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4781, 0, 65509, 1, 18, 0, 0, 0, 96, 3465, 0, 0, 8, 4598, 0, 0, 124, 350, 0, 0, 5, 124, 0, 96, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 56055, 0, 0, 0, 0, 5000, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 7506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2312, 0, 1, 17, 2310, 0, 0, 18], \"_msgid\": \"55713a82.52b914\" };","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1050,"y":140,"wires":[["f5192783.22df58","ac96e26c.05cc4"]]},{"id":"f5192783.22df58","type":"buffer-parser","z":"f77cda4d.5d7628","name":"","data":"payload","dataType":"msg","specification":"spec","specificationType":"ui","items":[{"type":"uint16be","name":"Grid_Voltage","offset":0,"length":1,"offsetbit":0,"scale":"/ 10.0","mask":""},{"type":"int16be","name":"Grid_Current","offset":2,"length":1,"offsetbit":0,"scale":"/ 10.0","mask":""},{"type":"int16be","name":"Inverter_Power","offset":4,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"PV1_Voltage","offset":6,"length":1,"offsetbit":0,"scale":"/ 10.0","mask":""},{"type":"uint16be","name":"PV2_Voltage","offset":8,"length":1,"offsetbit":0,"scale":"/ 10.0","mask":""},{"type":"uint16be","name":"PV3_Voltage","offset":10,"length":1,"offsetbit":0,"scale":"/ 10.0","mask":""},{"type":"uint16be","name":"PV4_Voltage","offset":12,"length":1,"offsetbit":0,"scale":"/ 10.0","mask":""},{"type":"uint16be","name":"Grid_Frequency","offset":14,"length":1,"offsetbit":0,"scale":"/ 10.0","mask":""},{"type":"int16be","name":"Battery_Voltage","offset":40,"length":1,"offsetbit":0,"scale":"/ 100.0","mask":""},{"type":"int16be","name":"Battery_Current","offset":42,"length":1,"offsetbit":0,"scale":"/ 100.0","mask":""},{"type":"int16be","name":"Battery_Power","offset":44,"length":1,"offsetbit":0,"scale":"1","mask":""}],"swap1":"","swap2":"","swap3":"","swap1Type":"swap","swap2Type":"swap","swap3Type":"swap","msgProperty":"payload","msgPropertyType":"str","resultType":"keyvalue","resultTypeType":"output","multipleResult":false,"fanOutMultipleResult":false,"setTopic":true,"outputs":1,"x":1060,"y":200,"wires":[["34d018b4.528008"]]},{"id":"ac96e26c.05cc4","type":"debug","z":"f77cda4d.5d7628","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1230,"y":140,"wires":[]},{"id":"34d018b4.528008","type":"debug","z":"f77cda4d.5d7628","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1230,"y":200,"wires":[]}]

```

---

<div class="post-metadata">

**Author:** ![Becker](https://avatars.discourse-cdn.com/v4/letter/b/c77e96/32.png) [@Becker](https://discourse.nodered.org/u/Becker)\
**Post date:** [28 December 2020 10:35 UTC](https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114/15 "2020-12-28T10:35:42Z")

</div>

that reminds me of my Modbus beginnings 😀  
At some point I stopped and got it right with Steve-Mcl Buffer Parser, it took a while for me to drop the penny 😉 but after it I was (am) very satisfied.

---

<div class="post-metadata">

**Author:** ![oliver.es](https://avatars.discourse-cdn.com/v4/letter/o/dc4da7/32.png) [@oliver.es](https://discourse.nodered.org/u/oliver.es)\
**Post date:** [28 December 2020 12:04 UTC](https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114/16 "2020-12-28T12:04:53Z")

</div>

Excellent. It works. I'm trying to understand offset. Every register have 2 bytes length message? How I can determine how length is?

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [28 December 2020 12:53 UTC](https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114/17 "2020-12-28T12:53:33Z")

</div>

Your input data is a 16bit integer array so every value is 2 bytes long.

The `length` is property relates to how many of the specified type you want to create from your input data. The built in help describes it better.

---

<div class="post-metadata">

**Author:** ![oliver.es](https://avatars.discourse-cdn.com/v4/letter/o/dc4da7/32.png) [@oliver.es](https://discourse.nodered.org/u/oliver.es)\
**Post date:** [28 December 2020 13:12 UTC](https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114/18 "2020-12-28T13:12:13Z")

</div>

16 bit integer array is not the same as 16 bit integer registry value? Because some registry values are 32 bit.

---

<div class="post-metadata">

**Author:** ![UnborN](https://avatars.discourse-cdn.com/v4/letter/u/4491bb/32.png) [@UnborN](https://discourse.nodered.org/u/UnborN)\
**Post date:** [28 December 2020 14:39 UTC](https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114/19 "2020-12-28T14:39:08Z")

</div>

The modbus node gives you back an array reply for the range of modbus registers you requested.  
Its up to you to make calculations later and with the use of Buffer-parser to convert them to the correct type depending on the manufacturer.

See a post from Steve regarding the calculations he made in that example as to what registers to read and what offset to use.

1 register = 2 bytes = 16bits  
32bit values need 4 bytes and from the device docs you'll see that you need to read two registers to calc. them.

> [@Adding two values](https://discourse.nodered.org/t/adding-two-values/32784/35):
>
> Here is my complete post again - try it & see where you get to... Hi again, as mensioned earlier, this is how you can do it with buffer parser... (obviously I dont have your invertor so all values are simulated - zero) this is the flow i did... [{"id":"3c70a20c.01d53e","type":"inject","z":"15164b61.40f905","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":220,"y":300,"wires":[["bb340a9c.a81c58","7bdb6cd4.f23b24","58e3f…

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [28 December 2020 14:40 UTC](https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114/20 "2020-12-28T14:40:53Z")

</div>

There are no 32but values in the data you provided - only 16bit values that you can coerce/convert into 32 bit values.

But if there were actually values \> 65535 then this would not work, and that is why we suggest using other modbus nodes as they provide a byte buffer in the output.

[Next page](https://discourse.nodered.org/t/how-to-decode-16-bit-unsigned-integer/38114.md?page=2)
