物聯網設備管理、網絡設備批量入庫時,常需按 MAC 地址段生成設備檔案。MAC 地址本質是 48 位十六進制數,按數值遞增即可枚舉區間內所有地址,避免逐行解析文本的低效與繁瑣。
/**
* MAC 字符串轉長整型(去冒號,按 16 進制解析)
*/
public static long macToLong(String mac) {
String hex = mac.replaceAll(":", "");
return Long.parseLong(hex, 16);
}
/**
* 長整型轉標準 MAC 字符串(補齊 12 位,插入冒號)
*/
public static String longToMac(long value) {
String hex = Long.toHexString(value);
// 高位可能省略導零,需補齊 12 字符
hex = String.format("%012s", hex).replace(' ', '0');
StringBuilder sb = new StringBuilder(hex);
sb.insert(2, ":").insert(5, ":").insert(8, ":").insert(11, ":").insert(14, ":");
return sb.toString().toUpperCase();
}
/**
* 打印 [startMac, endMac] 區間內所有 MAC
*/
public static void printMacRange(String startMac, String endMac) {
long start = macToLong(startMac);
long end = macToLong(endMac);
if (start > end) throw new IllegalArgumentException("起始 MAC 不得大於結束 MAC");
for (long i = start; i <= end; i++) {
System.out.println(longToMac(i));
}
}
/**
* 計算區間內 MAC 總數(含邊界)
*/
public static long countMacRange(String startMac, String endMac) {
return macToLong(endMac) - macToLong(startMac) + 1;
}
百萬級區間直接循環會阻塞主線程,建議:
BlockingQueue 解耦。// 生產者示例
public void produceMacBatch(String startMac, String endMac, BlockingQueue<List<String>> queue, int batchSize) {
long start = macToLong(startMac);
long end = macToLong(endMac);
List<String> batch = new ArrayList<>(batchSize);
for (long i = start; i <= end; i++) {
batch.add(longToMac(i));
if (batch.size() == batchSize) {
queue.offer(new ArrayList<>(batch));
batch.clear();
}
}
if (!batch.isEmpty()) queue.offer(batch);
}
Long.parseLong 默認大端,轉換無需額外處理。FF:FF:FF:FF:FF:FF 對應 281474976710655,遠小於 Long.MAX_VALUE,安全。將 MAC 視為 48 位無符號整數,利用 Long 承載、十六進制格式化輸出,配合批量異步入庫模式,可高效解決千萬級設備批量註冊問題。核心代碼不足 30 行,卻能替換繁瑣的文本解析流程,體現「數據結構決定算法效率」的編程哲學。