2013-12-08 60 views
0

我想將String反序列化爲int []數組並返回。我嘗試這樣的事情如何將字符串轉換爲整數數組並返回到JAVA

public static int[] getIntArrayFromString(String string, int stringMaxLenght) { 
    byte[] bytes = string.getBytes(); 

    int rest = bytes.length % 4; 
    int times = (bytes.length - rest)/4;  

    int[] result = new int[stringMaxLenght]; 
    int maxIndex = 0; 
    for (int i = 0; i < times; i++) { 
     if (times > stringMaxLenght) 
      break; 
     int in = createIntFromBytes(bytes[i * 4 + 0], bytes[i * 4 + 1], bytes[i * 4 + 2], 
       bytes[i * 4 + 3]); 
     result[i] = in; 
     maxIndex = i; 
    } 
    byte[] restb = new byte[4]; 
    for (int i = 0; i < rest; i++) { 
     restb[i] = bytes[(maxIndex + 1 * 4) + i]; 
    } 

    if (times < stringMaxLenght) { 
     int lastInt = createIntFromBytes(restb); 
     result[maxIndex + 1] = lastInt; 
    } 
    return result; 
} 

public static int createIntFromBytes(byte byte0, byte byte1, byte byte2, byte byte3) { 
    byte[] byteArray = new byte[4]; 
    byteArray[0] = byte0; 
    byteArray[1] = byte1; 
    byteArray[2] = byte2; 
    byteArray[3] = byte3; 
    return createIntFromBytes(byteArray); 
} 

public static String getStringFromIntegerArray(int[] intArray) {   
    ByteBuffer buffer = ByteBuffer.allocate(intArray.length * 4); 
    for (int integer : intArray) { 
     byte[] bs = createBytesFromInt(integer); 
     buffer.put(bs); 
    } 
    return getStringFromBytes(buffer.array()); 
} 

public static int createIntFromBytes(byte[] bytes) { 
    return ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN).getInt(); 
} 

public static String getStringFromBytes(byte[] bytes) { 
    String string = new String(bytes); 
    return string.trim();// otherwise it creates string with empty chars 
} 

但似乎不工作,例如字符串「簽名」。你有什麼想法,我做錯了什麼,或者應該如何做得更好。

+3

沒有提及代碼,你會期望*字符串「Signature」以整數數組的形式返回嗎?還要注意,調用'String.getBytes'而不指定編碼通常是一個壞主意,因爲它將使用平臺默認編碼。 –

+0

你能解釋一下你爲什麼要這樣做嗎?因爲有幾種方法,可能只有一種方法適合你的問題。 – TwoThe

+1

你應該首先獲取字符串的字符,然後獲取與該字符對應的Integer。 Integer的值取決於您指定的編碼方案或平臺默認編碼。 –

回答

0
How to convert String to Integer array and back in JAVA 

雖然你的問題的內容我也不清楚,假設你想知道一個內置的功能,請在int數組字符串,您可以利用Arrays.toString功能的轉換,例如:

String strArr = Arrays.toString(new int[]{112, 12 ,13}); 
    System.out.println(strArr); 

它將創建以下類型的輸出格式的:

[112, 12, 13] 
+0

我需要與String.getBytes()相同的功能,僅用於整數。這是爲內存表示爲int單元格,我想序列化字符串「簽名」。目的是將字符串寫入內存並再次讀取。 – Babu

2
public static void main(String[] args) { 
    int[] test = {1,2,3,4,5,6,7,8}; 

    // From int[] to String 
    String input = Arrays.toString(test); 

    // Test 
    System.out.println(input); 

    // String back to int[] 
    test = toIntArray(input); 

    // Test 
    input = Arrays.toString(test); 
    System.out.println(input); 

} 

public static int[] toIntArray(String input) { 
    String beforeSplit = input.replaceAll("\\[|\\]|\\s", ""); 
    String[] split = beforeSplit.split("\\,"); 
    int[] result = new int[split.length]; 
    for (int i = 0; i < split.length; i++) { 
     result[i] = Integer.parseInt(split[i]); 
    } 
    return result; 
} 

結果:

[1,2,3,4,5,6,7,8]

[1,2,3,4,5,6,7,8]

+0

感謝您的回答,我想我並不清楚。該字符串不像integeres,但正常的字母,所以我不能使用parseInt。 – Babu

0

問題在於這一行。有一個不好的索引偏移量。

錯誤:restb [i] = bytes [(maxIndex + 1 * 4)+ i];

好:restb [i] = bytes [(maxIndex * 4)+ i + 4];

所以它可能有助於某人。這段代碼現在運行良好。

public static int[] getIntArrayFromString(String string, int stringMaxLenght) { 
byte[] bytes = string.getBytes(); 

int rest = bytes.length % 4; 
int times = (bytes.length - rest)/4;  

int[] result = new int[stringMaxLenght]; 
int maxIndex = 0; 
for (int i = 0; i < times; i++) { 
    if (times > stringMaxLenght) 
     break; 
    int in = createIntFromBytes(bytes[i * 4 + 0], bytes[i * 4 + 1], bytes[i * 4 + 2], 
      bytes[i * 4 + 3]); 
    result[i] = in; 
    maxIndex = i; 
} 
byte[] restb = new byte[4]; 
for (int i = 0; i < rest; i++) { 
    restb[i] = bytes[(maxIndex * 4) + i + 4]; 
} 

if (times < stringMaxLenght) { 
    int lastInt = createIntFromBytes(restb); 
    result[maxIndex + 1] = lastInt; 
} 
return result; 
} 

public static int createIntFromBytes(byte byte0, byte byte1, byte byte2, byte byte3) { 
    byte[] byteArray = new byte[4]; 
    byteArray[0] = byte0; 
    byteArray[1] = byte1; 
    byteArray[2] = byte2; 
    byteArray[3] = byte3; 
    return createIntFromBytes(byteArray); 
} 

public static String getStringFromIntegerArray(int[] intArray) {   
    ByteBuffer buffer = ByteBuffer.allocate(intArray.length * 4); 
    for (int integer : intArray) { 
     byte[] bs = createBytesFromInt(integer); 
     buffer.put(bs); 
    } 
    return getStringFromBytes(buffer.array()); 
} 

public static int createIntFromBytes(byte[] bytes) { 
    return ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN).getInt(); 
} 

public static String getStringFromBytes(byte[] bytes) { 
    String string = new String(bytes); 
    return string.trim();// otherwise it creates string with empty chars 
} 
相關問題