小编use*_*919的帖子

在Android/Java中格式化MAC地址,而不会产生不必要的垃圾

我正在开发一个Android应用程序,它需要每秒处理数千个数据包,同时提取和格式化每个帧的MAC地址.问题是垃圾收集器每秒运行十几次并拖延我的应用程序,这反过来让我错过了数据包.我避免创建新对象(我认为)可能.

我在DDMS中使用了分配跟踪器,并确定要清理的99%的垃圾来自以下方法.这是我正在使用的代码:

void parseMac() { 
    hex_sb.setLength(0);

    for (hex_counter = 0; hex_counter < 6; hex_counter++) {
        hex_sb.append(String.format("%02X", parser_packet_bytes[parser_skip + hex_counter])); 
        if (!(hex_counter == 5)) {
            hex_sb.append(":");
        }
    }

    formatted_mac = hex_sb.toString();
}
Run Code Online (Sandbox Code Playgroud)

hex_sb是一个StringBuilder,可以重用.hex_counter是MAC地址中的字节数(字节来自parser_packet_bytes,byte []).如果它不是MAC的最后一个字节,请附加":"以进行正确的格式化.formatted_mac是一个类范围的String,用于存储格式化的MAC.根据分配跟踪器,唯一的问题是使用String.format的行.

我对StackOverflow专家的问题是:如何重写上述方法,以便创建更少(最好没有)垃圾?

java android garbage-collection

5
推荐指数
1
解决办法
674
查看次数

Java位移导致负数

我试图使用位移来将字节转换为十六进制(作为char)等效的方法.但是,我遇到了一些意想不到的结果:一些数字又回来了.我知道Java没有等效的无符号整数,我不知道如何使这个工作.这是我的代码:

final static char[] hex_val = "0123456789ABCDEF".toCharArray();

public static void main(String[] args) {
    byte[] bytes = {(byte) 0x58, (byte) 0x6D, (byte) 0x8F, (byte) 0xBA, (byte) 0xF5, (byte) 0x81};

    for (int i = 0; i < bytes.length; i++) {
        System.out.println("Run: " + i);
        System.out.println("First nibble: " + hex_val[(bytes[i] >> 4)]);
        System.out.println("Second nibble: " + hex_val[(bytes[i] & 0xf)]);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

运行:0首先半字节:5秒半字节:8运行:1首先半字节:6秒半字节:D运行:2

接下来是:线程"main"中的异常java.lang.ArrayIndexOutOfBoundsException:-8 at Test.main(Test.java:10)

我知道我可以使用String.format()来实现这一点,但我没有使用该方法,因为我需要一个在生成最少垃圾的同时快速工作的方法.我对专家的问题是......我可以改变什么使这项工作成功?

UPDATE

我做了Ted Hopp建议的修改,它在测试方法中完美运行.我将它移动到我的Android应用程序,该应用程序将字节转换为MAC地址为包含格式化MAC的char [].我不再得到负数,但我得到的似乎是随机误算.这是我正在使用的方法:

static final char[] parser_hex_arr = "01234567890ABCDEF".toCharArray();
static final char[] parser_mac = " …
Run Code Online (Sandbox Code Playgroud)

java bit-shift

3
推荐指数
1
解决办法
1539
查看次数

标签 统计

java ×2

android ×1

bit-shift ×1

garbage-collection ×1