Archived
0

fix read/write String

This commit is contained in:
2018-04-19 08:53:09 +03:00
parent 65e97ef834
commit dc9cc95879
7 changed files with 21 additions and 9 deletions

View File

@@ -17,6 +17,7 @@ public abstract class NetStream {
public abstract void readBytes(byte[] buffer); public abstract void readBytes(byte[] buffer);
public abstract int readUnsignedByte(); public abstract int readUnsignedByte();
public abstract int readUnsignedShort(); public abstract int readUnsignedShort();
public abstract short readShort();
public abstract int readInt(); public abstract int readInt();
public abstract float readFloat(); public abstract float readFloat();
public abstract double readDouble(); public abstract double readDouble();

View File

@@ -39,6 +39,11 @@ public class ByteArrayOutputNetStream extends NetStream_p125 {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@Override
public short readShort() {
throw new UnsupportedOperationException();
}
@Override @Override
public int readInt() { public int readInt() {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();

View File

@@ -13,7 +13,12 @@ import java.nio.charset.StandardCharsets;
public abstract class NetStream_p125 extends NetStream { public abstract class NetStream_p125 extends NetStream {
@Override @Override
public String readString() { public String readString() {
int size = readUnsignedByte() * 2; int size = readShort() * 2;
if (size == 0) {
log.warn("String zero length??");
return "";
}
byte[] bytes = new byte[size]; byte[] bytes = new byte[size];
readBytes(bytes); readBytes(bytes);
return new String(bytes, StandardCharsets.UTF_16BE); return new String(bytes, StandardCharsets.UTF_16BE);
@@ -21,14 +26,14 @@ public abstract class NetStream_p125 extends NetStream {
@Override @Override
public void writeString(String value) { public void writeString(String value) {
if (value.length() > 240) { if (value.length() > Short.MAX_VALUE) {
log.warn("String \"{}\" too long!", value); log.warn("String \"{}\" too long!", value);
byte[] buf = value.substring(0, 240).getBytes(StandardCharsets.UTF_16BE); byte[] buf = value.substring(0, Short.MAX_VALUE).getBytes(StandardCharsets.UTF_16BE);
writeByte(240); writeShort(Short.MAX_VALUE);
writeBytes(buf); writeBytes(buf);
} else { } else {
byte[] buf = value.getBytes(StandardCharsets.UTF_16BE); byte[] buf = value.getBytes(StandardCharsets.UTF_16BE);
writeByte(value.length()); writeShort(value.length());
writeBytes(buf); writeBytes(buf);
} }
} }

View File

@@ -41,6 +41,11 @@ public class WrapperNetStream extends NetStream_p125 {
return byteBuf.readUnsignedShort(); return byteBuf.readUnsignedShort();
} }
@Override
public short readShort() {
return byteBuf.readShort();
}
@Override @Override
public int readInt() { public int readInt() {
return byteBuf.readInt(); return byteBuf.readInt();

View File

@@ -20,7 +20,6 @@ public class HandshakePacket implements CSPacket, SCPacket {
@Override @Override
public void readSelf(NetStream netStream) { public void readSelf(NetStream netStream) {
netStream.skipBytes(1);
String[] str = netStream.readString().split(";"); String[] str = netStream.readString().split(";");
playerName = str[0]; playerName = str[0];
@@ -37,7 +36,6 @@ public class HandshakePacket implements CSPacket, SCPacket {
@Override @Override
public byte[] toByteArray() { public byte[] toByteArray() {
ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream();
netStream.writeByte(0);
netStream.writeString("-"); netStream.writeString("-");
return netStream.toByteArray(); return netStream.toByteArray();
} }

View File

@@ -19,7 +19,6 @@ public class KickPacket implements SCPacket {
@Override @Override
public byte[] toByteArray() { public byte[] toByteArray() {
ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream();
netStream.writeByte(0);
netStream.writeString(reason); netStream.writeString(reason);
return netStream.toByteArray(); return netStream.toByteArray();
} }

View File

@@ -35,7 +35,6 @@ public class LoginPacket implements CSPacket, SCPacket {
@Override @Override
public void readSelf(NetStream netStream) { public void readSelf(NetStream netStream) {
protocol = netStream.readInt(); protocol = netStream.readInt();
netStream.skipBytes(1);
playerName = netStream.readString(); playerName = netStream.readString();
} }