0

I have a hex string as follows:

"0d0d6e2800b900826bd000ba008a697800bc0094672000be009264c800bf0098627000c0009b601800c500c45dc000c600bf5b6800c700e2591000c800aa56b800c800ef546000c900b5520800ca00b84fb000ca00b74d5800cb00b84b0000cc00be48a800cc00ba465000cd00be43f800cd00bf41a000ce00c13f4800cf00c43cf000cf00c53a9800d000c3384000d000c935e800d100c6339000d100cb313800d200ca2ee000d300ca2c8800d300cc2a3000d300e227d800d400dd258000d400e0232800d600cd20d000d700cf1e7800d700d11c2000d700d519c800d800d4177000d800d6151800d800d412c000d800d6106800d800d70e1000d800d60bb800d800d3096000d800db070800d900d804b000d900db025800d800da000000d700da"

I need to convert this to Signed 16-bit integer big-endian and get the values that can be seen when converted through this online converter https://www.scadacore.com/tools/programming-calculators/online-hex-converter/

I am getting the correct values for some values but not others with the below code

        #data = hex string
        byte = bytearray.fromhex(data)

        for i in byte:
            print(i)

This gives me an output like below

13
13
110
40
0
185
0
130
107
208
0
186
0
138
105
120

But the larger values aren't being converted properly. How do I do this in Python to mirror the results from the online converter?

2 Answers 2

1

You have converted the hex to bytes, but you never interpreted those bytes as a series of 16-bit ints. This can be done with the struct module:

import struct


hex_data = "0d0d6e2800b900826bd000ba008a697800bc0094672000be009264c800bf0098627000c0009b601800c500c45dc000c600bf5b6800c700e2591000c800aa56b800c800ef546000c900b5520800ca00b84fb000ca00b74d5800cb00b84b0000cc00be48a800cc00ba465000cd00be43f800cd00bf41a000ce00c13f4800cf00c43cf000cf00c53a9800d000c3384000d000c935e800d100c6339000d100cb313800d200ca2ee000d300ca2c8800d300cc2a3000d300e227d800d400dd258000d400e0232800d600cd20d000d700cf1e7800d700d11c2000d700d519c800d800d4177000d800d6151800d800d412c000d800d6106800d800d70e1000d800d60bb800d800d3096000d800db070800d900d804b000d900db025800d800da000000d700da"

bytes_data = bytes.fromhex(hex_data)

# ">" means big-endian, "h" means 16-bit int
num_ints = len(bytes_data) // 2
fmt = '>' + 'h' * num_ints  # alternatively: fmt = f'>{num_ints}h'
result = struct.unpack(fmt, bytes_data)

print(result)  # (3341, 28200, 185, 130, 27600, 186, ...)
Sign up to request clarification or add additional context in comments.

Comments

0

Try:

byte = bytearray.fromhex(data)
for i in range(0, len(byte), 2):
    value = (byte[i] << 8) + byte[i + 1]
    print(value)

Output:

3341
28200
185
130
27600
186

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.