我正在发送此消息: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());
}
}
}
答案 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,并要注意消息长度是均匀的。此方法仅从字符串中获取前两位数字,然后将它们放置在字符串数组中,直到字符串用尽为止。