我有一个名为byteArr[]
的字节数组。我需要从中删除前4个字节。我的代码如下所示。这里我使用字节数组来存储输入字符串。我输出了一些不需要的字节,即从第五个开始不需要前四个字节是正确的。我的程序是使用rfid机器从尊重的rfid标签获取id。
public class Serverc {
final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
public static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for (int j = 0; j < bytes.length; j++) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
public static void connection() throws IOException {
ServerSocket ss = new ServerSocket(9888);//exce
ss.setSoTimeout(300000000);//exce
System.out.println("Waiting for client on port " + ss.getLocalPort() + "...");
while (true) {
Socket server = ss.accept();//exce
System.out.println("Just connected to " + server.getRemoteSocketAddress());
int available = 0;
DataInputStream in = new DataInputStream(server.getInputStream());//exce
int input = 0;
//BufferedReader br = new BufferedReader(in);
byte byteArr[] = new byte[28];
try {
//read till the end of stream
//while((input = in.available()) != -1)
while ((input = in.read(byteArr)) != -1) {
System.out.println("Size read is " + input);
System.out.println("Data is " + bytesToHex(byteArr));
}
//System.out.println("inside finally");
server.close();//exce
//System.out.println("outside finally");
} catch (SocketTimeoutException ex) {
System.out.println("Socket timed out!");
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String args[]) throws IOException {
Serverc obj = new Serverc();
obj.connection();
}
}
这是我的控制台
Waiting for client on port 9888...
Just connected to /106.208.71.50:61532
Size read is 28
Data is 55000016910001DB00FB63ABEEAFC1EC888F10263410050711148F3500000000
Size read is 28
Data is 55000016910001DB00FB63ABEEAFC1EC888F10263410050711148F3500000000
Size read is 28
Data is 55000016910001DB00FB63ABEEAFC1EC888F10263410050711148F3500000000
Size read is 28
Data is 55000016910001DB00FB63ABEEAFC1EC888F10263410050711148F3500000000
Size read is 28
Data is 55000016910001DB00FB63ABEEAFC1EC888F10263410050711148F3500000000
这里我需要从输出中删除55000016。 提前谢谢
答案 0 :(得分:4)
您可以使用Arrays.copyOfRange方法过滤不需要的字节并将结果保存到新的字节数组。
byte[] filteredByteArray = Arrays.copyOfRange(byteArr, 4, byteArr.length - 4);
答案 1 :(得分:2)
如果你想跳过前四个字节改变它,
for (int j = 0; j < bytes.length; j++) {
类似
for (int j = 4; j < bytes.length; j++) {
或者您可以使用String.substring(int)
bytesToHex(byteArr).substring(8); // <-- skip the first 4 bytes
答案 2 :(得分:0)
最好跳过4个字节。但是如果你想删除它们,你应该使用这个解决方案(你的阵列可能变得庞大)。这个算法最好用Java来解决你的问题。 O(1)空间,O(n)时间。
void removeFourBytes(byte[] a) {
for (int i = 4; i < a.length; i++) {
a[i-4]=a[i];
}
for (int i = a.length - 1; i > a.length - 5; i--) {
a[i] = 0;
}
}
第二个最佳选择是System.arrayCopy() - O(n)空格,O(n)时间。
答案 3 :(得分:0)
您遇到的问题比跳过每个数据包开头的4个字节要大。您的代码执行此操作:
byte byteArr[] = new byte[28];
try {
while ((input = in.read(byteArr)) != -1) {
System.out.println("Size read is " + input);
System.out.println("Data is " + bytesToHex(byteArr));
}
(删除了注释掉的行)
请注意,您不能保证每次调用in.read()
时都会读取所有28个字节,但您的bytesToHex()
方法假设存在28个有效字节数组。在处理数据之前,您需要收集读入数组的数据,直到您拥有所有数据包,可能使用DataInputStream
方法readFully(byte[])
。 然后您可以跳过其他答案中建议的前4个字节。