I second TCWORLD's opinion that sprintf is almost always a better solution to formatting than the String class. I like snprintf a little better since it is safer but in this case you will never overflow the character array.
In addition to being simpler the sprintf solution takes less memory. This sketch takes 4070 bytes and has no zero fill.
uint8_t mac[] = {110, 5, 30, 0, 50, 12};
void setup() {
Serial.begin(9600);
String dataString = "";
dataString += String(mac[0], HEX);
dataString += ":";
dataString += String(mac[1], HEX);
dataString += ":";
dataString += String(mac[2], HEX);
dataString += ":";
dataString += String(mac[3], HEX);
dataString += ":";
dataString += String(mac[4], HEX);
dataString += ":";
dataString += String(mac[5], HEX);
Serial.println(dataString);
}
void loop() {
}
This sketch takes 3528 bytes and is very simple.
uint8_t mac[] = {110, 5, 30, 0, 50, 12};
void setup() {
Serial.begin(9600);
char dataString[50] = {0};
sprintf(dataString, "%02X:%02X:%02X:%02X:%02X:%02X",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
Serial.println(dataString);
}
void loop() {
}
If memory is a problem you can do something like this which takes 2220 bytes but is not a general solution.
uint8_t mac[] = {110, 5, 30, 0, 50, 12};
void setup() {
Serial.begin(9600);
for (uint8_t i = 0; i < 6; i++) {
if (i) Serial.write(':');
if (mac[i] < 16) Serial.write('0');
Serial.print(mac[i], HEX);
}
Serial.println();
}
void loop() {
}