Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Most Significant Byte Calculation

Tags:

python

I am trying to implement a larger cipher problem, and I am running into an issue I don't quite understand when taking the Most Significant Byte (not bit).

To turn an int into a byte I am using:

def binary(i):
    if i == 0:
        return "0"
    s = ''
    while i:
        if i & 1 == 1:
            s = "1" + s
        else:
            s = "0" + s
        i >>= 1
    return s 

I am pretty sure the above is correct, it works with my test numbers. To then extract the Most Significant Byte I am using:

def msb(i):
    a = binary(i)
    b = a[0:7]
    c = int(b,2)
    return c

However, this seems to return a number half what I would expect. Am I wrong in thinking you can get the most significant byte by just taking the first 8 bits, or am I missing something else silly?

like image 640
Geordie Wicks Avatar asked Oct 20 '25 11:10

Geordie Wicks


2 Answers

There are much easier ways to do this. For example, if you want the top eight bits (ignoring byte alignment), you can do:

def msb(val):
    return val >> (val.bit_length() - 8)

For the most significant aligned byte, in Python 3 you can do:

def msb(val):
    return val.to_bytes((val.bit_length() + 7) // 8, 'big')[0]

In Py2, you'd have to convert to a hex string and back to match the to_bytes approach.

like image 67
ShadowRanger Avatar answered Oct 23 '25 00:10

ShadowRanger


Your example code only gets the seven leading bits, not 8:

def msb(i):
    a = binary(i)
    b = a[0:7]   # gets first SEVEN characters of string a
    c = int(b,2)
    return c

Change it to a[0:8] to extract 8 leading characters/bits rather than 7.

like image 39
Dan Lenski Avatar answered Oct 22 '25 23:10

Dan Lenski



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!