2017-08-11 130 views
2

我正在爲Android的SMS應用程序工作,其中我在單個SMS中發送預定義大小的字符串。在發送端,我串聯了一些預定義大小的字符串。一旦我收到短信,我想根據它們的大小將長字符串拆分爲更小的字符串。將長字符串拆分爲指定大小的較小字符串

下面是一個簡單的代碼來解釋我已經嘗試:

// On the SMS sending side 
String str1 = new String(new char[8]); 
String str2 = new String(new char[4]); 
String str3 = new String(new char[2]); 
String str4 = new String(new char[2]); 

String sendSMS = str1 + str2 + str3 + str4; 

// send SMS 

接收到數據後,我想單獨組合的字符串轉化爲STR1,STR2,STR3,STR4數據,因爲我知道每個小字符串的大小。

到目前爲止,我已經在SO上找到了很多答案,所有這些答案都使用split()函數,但是在連接的字符串之間沒有分隔的字符標記。相反,我想使用每個子字符串的大小知識來獲取它們。類似於sscanf的東西就是我正在尋找的東西。

+0

所以,你的意思是你需要'String.substring ()'? –

+0

我看過'String.substring()',但是我有很多字符串,並且使用子字符串提取每個字符串變得非常混亂。有沒有一種方法可以將每個字符串的大小用於單個函數調用,這可以將字符串拆分爲更小的字符串的字符串數組?正如我在我的問題中所說,這將是非常類似於C++中的'sscanf'(如果存在) – masad

回答

3

我的建議是使用StringBuilder。假設你被給予從你的問題sendSMS,你想通過str4得到str1,你可以這樣做:

StringBuilder sb = new StringBuilder(sendSMS); 
str1 = getStringFromSb(sb, 8); 
str2 = getStringFromSb(sb, 4); 
str3 = getStringFromSb(sb, 2); 
str4 = getStringFromSb(sb, 2);  

而且getStringFromSb方法:

String getStringFromSb(StringBuilder sb, int stringLength) 
{ 
    String returnStr = sb.substring(0, stringLength); 
    sb.delete(0, stringLength); 
    return returnStr; 
} 
+0

非常感謝!這和其他一些答案一樣有效。我喜歡你的解決方案,儘管它與在其他答案中使用增量索引非常相似。 – masad

3

如果您事先知道小字符串的大小,您可以從大字符串中計算出每個字符串的索引。你可以使用substring(startIndex, endIndex)函數來做到這一點。

Here is an example

您可以使用此功能,您自己的效用函數中這樣

List<String> extractSmallString(String longString, List<Integer> smallStringSize) { 
    ArraysList<String> extraction = new ArrayList<>(); 
    int i = 0; 
    for (int size : smallStringSize) { 
     extraction.add(longString.substring(i, i + size); 
     i += size; 
    } 
    return extraction 
} 
+0

我看過'String.substring()',但是我有很多字符串,它變得非常混亂子串提取每個字符串。有沒有一種方法可以將每個字符串的大小用於單個函數調用,這可以將字符串拆分爲更小的字符串的字符串數組?正如我在我的問題中所說的,這與C++中的'sscanf'非常類似(如果存在) – masad

+1

爲什麼不創建自己的函數,在內部使用'substring'函數來獲取小字符串大小的列表以及返回'List '? – jeanr

4

下面是一些示例代碼,以做你想做的事情...... 但是,它沒有錯誤檢查我將留給你。

String[] splitter(String input, int[] lengths) 
{ 
    String[] output = new String[lengths.length]; 
    int pos = 0; 
    for(int i=0;i<lengths.length;i++) 
    { 
     output[i] = input.substring(pos, pos+lengths[i]); 
     pos = pos + lengths[i]; 
    } 
    return output; 
} 
+0

非常感謝!我現在使用'substring'函數的方式與您的問題類似。不過,我也喜歡下面的'Stringbuilder'解決方案。 – masad

4

您可以使用這樣一個解決方案:

int index = 0; 
String str1= sms.substring(index, str1Length); 
index += str1Length; 
String str2 = and.substring(index, str2Length); 
Index += str2Length: 

....

您可以創建一個輔助類來做到這一點:

Class SmsExtractor{ 
    Int lastVisitedIndex = 0; 
    String msg; 

    Public SmsExtractor (String msg){ 
     This.msg=msg; 
    } 

    Public String extract(int length){ 
     String m = msg.substring(lastVisitedIndex, length); 
     lastVisitedIndex += length; 
     Return m; 
    } 
} 

並使用它:

SmsExtractor e = new SmsExtractor (receivedMsg); 
String str1 = e.extract(str1Length); 
String str2 = e.extract(str2Length); 

...

另一個直到SmsExtractor方法:

Public String[] extractAll (int[] lengths){ 
    String [] msgs = new String[lengths.length]; 
    For(int I =0; I< lengths.length; I++){ 
     msgs[I]= extract(lengths[I]); 
    } 
    Return msgs; 
} 
相關問題