i just forgot it's little endian and used the big endian method to convert 4 bytes into an int32 instead lol, this works fine now
```java
@Override
public DiscordPacket read() throws IOException {
byte[] header = readSocket(Integer.BYTES * 2);
DiscordPacket.OpCode opcode = DiscordPacket.OpCode.values()[fromBytes(Arrays.copyOfRange(header, 0, Integer.BYTES))];
int size = fromBytes(Arrays.copyOfRange(header, Integer.BYTES, Integer.BYTES * 2));
byte[] payload = readSocket(size);
return new DiscordPacket(
opcode,
DiscordRPCClient.GSON.fromJson(new String(payload, StandardCharsets.UTF_8), JsonObject.class)
);
}
private static int fromBytes(byte[] bytes) {
int ret = 0;
for (byte i = 0; i < bytes.length; i++) {
ret |= (bytes[i] & 0xFF) << i * 8;
}
return ret;
}
private native byte[] readSocket(int n) throws IOException;
```
```c
JNIEXPORT jbyteArray JNICALL Java_club_bottomservices_discordrpc_lib_pipe_UnixJNIPipe_readSocket(JNIEnv *env, jobject this, jint n) {
int fd;
if (!fdField || (fd = (*env)->GetIntField(env, this, fdField)) == -1) {
const jclass exClass = (*env)->FindClass(env, "java/io/IOException");
(*env)->ThrowNew(env, exClass, "Cannot read from socket that isn't connected.");
return NULL;
}
void *buf = malloc(n);
if (read(fd, buf, n) == -1) {
const char *errMsg = strerror(errno);
const jclass exClass = (*env)->FindClass(env, "java/io/IOException");
(*env)->ThrowNew(env, exClass, errMsg);
free(buf);
return NULL;
}
const jbyteArray ret = (*env)->NewByteArray(env, n);
(*env)->SetByteArrayRegion(env, ret, 0, n, buf);
free(buf);
return ret;
}
```
