微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在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();
}

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

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

最佳答案
而不是使用非常昂贵的String.format(),只需手动附加半字节.不幸的是,数字和字母在ASCII / UTF-8中不是连续的,所以这就是我如何处理它:

static final char HEX_DIGITS[] = "01234567890abcdef".tochararray();
...
hex_sb.append(HEX_DIGITS[thisByte >> 4]).append(HEX_DIGITS[thisByte & 0xf]);

由于这是一个MAC地址(已知长度)并被称为一大堆,我可能会展开整个事情,包括附加冒号/句点(应该是char,而不是String).如果它真的对速度至关重要,请管理自己的char []并将其提供给String#new(char []).您可以避免以这种方式重新插入分隔符.

原文地址:https://www.jb51.cc/android/430933.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐