如何合并来自同一字符数组的2个值?

时间:2019-06-05 12:05:55

标签: java android arrays

我正在发送此消息:53010422230205222345(十六进制),我想像这样对其进行解析:53,01,04,...,并将这些值分配给char数组以进行进一步操作。

当前,我正在尝试使用方法“ .toCharArray”将整个消息转换为char数组,该方法将每个字符放入其自己的元素中,因此下一步必须结合例如5和3至53,这就是我遇到的问题。

如果我尝试:

for (int count = 0; count < chMsg.length; count = count + 2){
sb.append(chMsg[count]);
sb.append(chMsg[count+2]);

char results[] = sb.toString().toCharArray();
msg[count1].Msg = results[];
}

我收到“必填:char,找到的:char []”错误。

对于:

for (int count = 0; count < chMsg.length; count = count + 2){
msg[count1].Msg = chMsg[count] + chMsg[count + 1];
}

我得到“必填:字符,找到:整数”。

必须有比我正在尝试的更优雅/简单的解决方案?如果我要尝试的操作没问题,我该如何更改才能使其正常工作?

下面是我尝试过的两种方法的全部代码。

public class MainActivity extends AppCompatActivity {

public String sendMsg;
public StringBuilder builder = new StringBuilder();
public StringBuilder sb = new StringBuilder();

int i;
int count1;

MsgArray msg[] = new MsgArray[sendMsg.length()];
DataClass[] data = new DataClass[arraySize];

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    CreateArray();

    if (sendMsg != ""){
        sendMsg = "";
    }

    sendBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            sendMsg = sendText.getText().toString();
            Conversion();
        }
    });
}

public void CreateArray(){
    for (i = 0; i < arraySize; i++) {
        data[i] = new DataClass();
    }

    for (i=0; i < sendMsg.length(); i++){
        msg[i] = new MsgArray();
    }
}

public void Conversion()
{
    count1 = 0;

    char[] chMsg = sendMsg.toCharArray();
    for (int count = 0; count < chMsg.length; count = count + 2){
        sb.append(chMsg[count]);
        sb.append(chMsg[count+2]);

        char results[] = sb.toString().toCharArray();
        msg[count1].Msg = results[];

        msg[count1].Msg = chMsg[count] + chMsg[count + 1];
    }

    if(sendMsg != "")
    {
        for (int a = 0; a < sendMsg.length(); a = a + 2){
            String s = sendMsg.substring(a, a + 2);
            int n = Integer.valueOf(s, 16);
            builder.append((char)n);
        }
        recieveText.setText("ASCII = " + builder.toString());
    }
}
}

3 个答案:

答案 0 :(得分:3)

String保存Unicode,即一个char数组,其中每个char为2个字节,以UTF-16编码。 因此,对于任意字节数组,内存加倍,在某些编码和字节之间进行了无意义的转换。对于UTF-8,此转换将出错,它将不允许任何字节序列。

您可以通过以下方式获取的字节:

byte[] bytes = new byte[chMsg.length / 2];
int byteI = 0;
for (int count = 0; count < chMsg.length; count = count + 2) {
    int b = Integer.parseInt(new String(chMsg, count, 2), 16); // 16 for hex
    bytes[byteI++] = (byte) b;
}

尽管如此,还是需要一个字符串,但可以使用:

String s = new String(bytes, "ISO-8859-1");
byte[] bytes = s.getBytes("ISO-8859-1");

语法char xxx[]是在Java中引入的,以与C / C ++兼容。在早期开始。更常规(更合乎逻辑)是char[] xxx

= results[]应该只是= results

答案 1 :(得分:0)

您可以为此使用正则表达式,每个2个字符:

String hex = "53010422230205222345";
String[] split = hex.split("(?<=\\G..)");

split[0]
split[1]

打印:

53
01

答案 2 :(得分:0)

另一种方法是:

public void fromMessageToArray(String theMessage){

        //  let's suppose the length of the message is always EVEN

        String tempMessage = theMessage;
        String[] msg = new String[tempMessage.length()/2];

        for(int i=0; i<msg.length; i++){
            msg[i] = tempMessage.substring(0,2);    //  first two (2) digits go to our array
            tempMessage = tempMessage.substring(2);  //  omit first two (2) digits
        }
    }

您应该使用我没有的stringbuilders,并要注意消息长度是均匀的。此方法仅从字符串中获取前两位数字,然后将它们放置在字符串数组中,直到字符串用尽为止。