2016-02-05 526 views
1

我會將myString「100.200.300.400」轉換爲字節數組[4]。 我是一個「有點」困惑,這是正確的或需要我使用一個foreach讀一個單一的數字?將IP或MAC地址從字符串轉換爲字節數組(Arduino或C)

String myString = "100.200.300.400"; 
byte myByteArray[4]; 
myString.getBytes(myByteArray,4); 

最後我想打印到串行數組。這應該是對的。

for (i=0; i<4; i++) { 
    Serial.print(myByteArray[i]); 
    Serial.print("."); //delimiter 
} 

我錯了嗎?我得到了49,48,48,0!

+2

49更大的是ASCII碼字符「1」,48是「0」等等。所以你得到了預期的結果。 –

+3

如果你想將它轉換爲一個字節數組,它聽起來像你只是想要的數字。問題是你有兩個大於255的數字,你不能將一個大的數字存儲到一個字節中。 –

+0

@DavidHoelzer最基本的問題是,OP正在嘗試將字符串轉換爲數字,而不是字符串轉換爲字節數組。 –

回答

6

如果你想從像"100.150.200.250"字符串得到一個字節數組像{ 100, 150, 200, 250 },你需要提取字符串表示的每個數字和轉換(解析)他們到二進制表示將它們存儲在字節數組中之前。

您試圖做到這一點的方式,只是將字符串中的前四個字節(即"100.")轉換爲每個字符的二進制表示形式,其結果爲{ 49, 48, 48, 0 }。你可以看看ASCII table

還記得,因爲你是存儲這個字節數組,它只會從0支持值255

當你在小單片機編程,我建議不要使用String類。當程序變大並且開始使用大量字符串時,您可能會遇到麻煩。嘗試學習如何使用字符數組,而不會遇到內存問題。記住Arduino只有2KB的RAM!

這裏是你可以使用使用strtoul()功能,使該轉換功能:

void parseBytes(const char* str, char sep, byte* bytes, int maxBytes, int base) { 
    for (int i = 0; i < maxBytes; i++) { 
     bytes[i] = strtoul(str, NULL, base); // Convert byte 
     str = strchr(str, sep);    // Find next separator 
     if (str == NULL || *str == '\0') { 
      break;       // No more separators, exit 
     } 
     str++;        // Point to next character after separator 
    } 
} 

然後你可以這樣調用轉換一個IP地址(基數爲10):

const char* ipStr = "50.100.150.200"; 
byte ip[4]; 
parseBytes(ipStr, '.', ip, 4, 10); 

或者這樣轉換MAC地址(16進制):

const char* macStr = "90-A2-AF-DA-14-11"; 
byte mac[6]; 
parseBytes(macStr, '-', mac, 6, 16); 
+0

感謝您的最明確的答案! – Davide

+0

如果我有像「90-A2-AF-DA-14-11」那樣的MAC地址,我可以使用相同的功能嗎?我認爲不是因爲我不需要字節轉換(MAC地址il已經是十六進制)。錯誤? – Davide

+1

@Davide我改變了一點功能來處理不同的數字基礎,並添加了一個MAC地址的例子。 –

1

你也可以我們Ësscanf,並順便用its return value檢測無效輸入:

byte ip[4]; 
if (sscanf(mString.c_str(), "%hhu.%hhu.%hhu.%hhu", ip, ip+1, ip+2, ip+3) != 4) { 
    Serial.print("invalid IP: "); 
    Serial.println(mString); 
} 

然而,sscanf可能不會在所有主板的庫中實現,例如在esp8266它在2.4.0版本yet to be released

此外,%hhu說明符unsigned char可能無法在某些版本的支持,但你可以用%u,讀給一個unsigned long並檢查值不大於255

相關問題