James Hancock
asked on
Python byte[]'s - Help me port this crucial Java byte[] method
Hi
The following code is crucial, working code that I have been using in RTS projects that, now that I'm a Python convert, I need assistance in getting it right. It isn't obvious.
I might be suffering from lack of experience issues, even formatting.
This is the working Java code, below, that I'd like to convert to Python that converts byte arrays to integers, and the other way.
I cant yet do a simple porting, if this even is simple?
Does Python even do static methods, for easy use from anywhere, or must I re-paste this into other classes? Should I make bytearrays.py with all these methods?
Thanks
The following code is crucial, working code that I have been using in RTS projects that, now that I'm a Python convert, I need assistance in getting it right. It isn't obvious.
I might be suffering from lack of experience issues, even formatting.
This is the working Java code, below, that I'd like to convert to Python that converts byte arrays to integers, and the other way.
I cant yet do a simple porting, if this even is simple?
Does Python even do static methods, for easy use from anywhere, or must I re-paste this into other classes? Should I make bytearrays.py with all these methods?
Thanks
public static byte[] intToByteArray(int value) {
byte[] b = new byte[4];
for (int i = 0; i < 4; i++) {
int offset = (b.length - 1 - i) * 8;
b[i] = (byte) ((value >>> offset) & 0xFF);
}
return b;
}
public static int byteArrayToInt(byte[] b, int offset) { #make offset 0 for beginning
int value = 0;
for (int i = 0; i < 4; i++) {
int shift = (4 - 1 - i) * 8;
value += (b[i + offset] & 0x000000FF) << shift;
}
return value;
}
ASKER
Thanks for those functions,
but, for some absurd reason, they are not visible from my run method, and I don't know why Python's visibility is non-intuitive?
In my code below, it complains that intToBytes is not visible, when it is the first thing defined!
What could I be doing wrong?
Thanks
but, for some absurd reason, they are not visible from my run method, and I don't know why Python's visibility is non-intuitive?
In my code below, it complains that intToBytes is not visible, when it is the first thing defined!
What could I be doing wrong?
Thanks
import threading, socket
class Server(threading.Thread):
def intToBytes(n):
print ("_________intToBytes___________")
b = bytearray([0, 0, 0, 0]) # init
b[3] = n & 0xFF
n >>= 8
b[2] = n & 0xFF
n >>= 8
b[1] = n & 0xFF
n >>= 8
b[0] = n & 0xFF
# Return the result or as bytearray or as bytes (commented out)
##return bytes(b) # uncomment if you need
return b
def bytesToInt(b, offset):
n = (b[offset+0]<<24) + (b[offset+1]<<16) + (b[offset+2]<<8) + b[offset+3]
return n
def __init__(self, numclients):
threading.Thread.__init__(self) # call parent class's __init__
print('Server constructor: ')
self.numClients=numclients
print(self.numClients, " clients")
def run(self):
print('Server run() . . . client join:')
B=intToBytes(150)
print(B[0])
print(" . ")
print([1])
print(" . ")
print([2])
print(" . ")
print([3])
print(" . ")
clientJoinMode=True
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
port = 1024
bufferSize = 1024
s.bind(("", port))
while clientJoinMode : # CLIENT JOIN LOOP
print ('JOIN waiting on port: ', port)
data, addr = s.recvfrom(bufferSize)
print ('s received from address ', addr, ': ',data[0]);
serverThread=Server(2)
serverThread.start()
Or you place them as functions outside the class definition, or add self as the very first argument. In the later case, you also should prepend self. when calling the methods. It must be explicitly written in Python. This means that then your line 47 must look like B = self.intToBytes(150)
ASKER
Thanks.
How would you make my run method look like to work? It isn't obvious. - Just a conversion, and a printing of the bytes.
Would you make an external .py file with all the byte[] conversion methods?
How would you make my run method look like to work? It isn't obvious. - Just a conversion, and a printing of the bytes.
Would you make an external .py file with all the byte[] conversion methods?
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks
Why did I get visibility errors? I'd like to avoid that mistake again!
"self" must be first in the arguments declarations? Makes sense
Why did I get visibility errors? I'd like to avoid that mistake again!
"self" must be first in the arguments declarations? Makes sense
ASKER
Thanks again
One last thing,
if I convert -256 to bytes, and try to print it back at the end, I don't get -256,
I get 4294967040
it prints 255 255 255 0 as the four bytes
One last thing,
if I convert -256 to bytes, and try to print it back at the end, I don't get -256,
I get 4294967040
it prints 255 255 255 0 as the four bytes
B = self.intToBytes(-256)
print(B[0])
print(" . ")
print(B[1])
print(" . ")
print(B[2])
print(" . ")
print(B[3])
print(" . ")
print(self.bytesToInt(B,0))
This is because of how the negative numbers are expressed. Think about a single byte that has 8 bits. One can express 2^8 = 256 states using 8 bits. But you can decide how the states will be used for encoding numbers. The most natural (in some sense) is to use one byte for expressing numbers from zero to 255 (that is 256 states). If you need to express also negative values, then the most natural is to use half of the interval for positive numbers (here from zero to 127), and approximately the other half for the negative values (from minus one to -128). For negative values, the most significant bit of the number is set to one, and the shift to right puts one's to that bit. This is the reason why the all ones appeared. There is the agreement that the bytes and bytearray types interpret the values as small positive integers. This way the byte with all bits set to one is displayed as 255.
For the self, yes. It must be explicitly declared in Python as the first argument. It could be given a different identifier but it is highly recommended to keep that convention.
Open in new window