字符被分配给特定的十六进制值/十进制值

时间:2014-07-21 08:59:21

标签: java android

现在,我对分配的工作方式感到有些困惑。 在我的代码中,没有任何变量赋值为十六进制值等等。

所以现在当打印出msg.getBytes的数据时,我得到了我的字符值。 我发了字符串,"淡马锡"我得到的回报是" 84 101 109 97 115 101 107"。 因此,从T到K的顺序,每个字母用十进制值表示。

我不知道的是,如何将这些十进制值分配给字符?我已经在代码上工作了好几天,我找不到哪个方法或哪个行用这些十进制值分配字符。

我想要理解的要点是,如何手动分配值或者是readThread方法中指定的值?

我需要更改值以匹配我的MC Side,因为我已经以不同的方式设置MicroController Side中每个字符的值。

所以一个例子是,而不是T = 84(0x54),我希望它是T = 52(0x34)。

这是 Logcat

07-21 17:02:05.500: I/System.out(16827): 84
07-21 17:02:05.500: I/System.out(16827): 101
07-21 17:02:05.500: I/System.out(16827): 109
07-21 17:02:05.500: I/System.out(16827): 97
07-21 17:02:05.500: I/System.out(16827): 115
07-21 17:02:05.500: I/System.out(16827): 101
07-21 17:02:05.500: I/System.out(16827): 107
07-21 17:02:05.507: I/System.out(16827): Mode: 1
07-21 17:02:05.507: I/Tag(16827): TextSetting[0] = 100

这是我的 SendMessageHandle方法

private void sendMessageHandle(String msg) {

    final byte ANIMATION_MODE=3;
    final byte PICTURE_MODE=2;
    final byte TEXT_MODE=1;
    final String PAUSE = "\r";

    int temp,row;

    sPrefs = getSharedPreferences("storeData",MODE_PRIVATE);

    byte mode = (byte) sPrefs.getInt("Mode",1);
    byte [] pictureData = new byte [129];
    byte [] textSetting =new byte [5];

    if (socket == null) {
        Toast.makeText(mContext, "No connection", Toast.LENGTH_SHORT)
                .show();
        return;
    }
    try {
        OutputStream os = socket.getOutputStream();
        if(mode==TEXT_MODE){
            byte[] buf = msg.getBytes();
            textSetting[0]=100;
            textSetting[1]=(byte) sPrefs.getInt("directionData", '1');
            textSetting[2]=(byte) sPrefs.getInt("positionData", '1');
            textSetting[3]=(byte) sPrefs.getInt("speedSeekBar", 10);
            if(sPrefs.getBoolean("checkBox1", true)){
                textSetting[4]=1 ;                          
            }
            else
                textSetting[4]=0 ;

            os.write(textSetting);  
            os.write(msg.getBytes());
            for(int i = 0; i<buf.length;i++)
            {
                System.out.println(buf[i]);
            }

        }

这是我的 clientThread方法

private class clientThread extends Thread {
        public void run() {

            try {
                //
                bdDevice = bluetoothAdapter.getRemoteDevice(BlueToothAddress);
                socket = bdDevice.createRfcommSocketToServiceRecord(UUID
                        .fromString("00001101-0000-1000-8000-00805F9B34FB"));
                Message msg2 = new Message();
                msg2.obj = "Please wait, connecting to server: "
                        + BlueToothAddress;
                msg2.what = 0;
                LinkDetectedHandler.sendMessage(msg2);
            //  System.out.println(socket + "|mac:" + BlueToothAddress);
                socket.connect();

                Message msg = new Message();
                msg.obj = "Device connected. Sending message is allowed.";
                msg.what = 0;
                LinkDetectedHandler.sendMessage(msg);
                //
                readThread = new readThread();
                readThread.start();
                click++;
                //contentEV.setInputType(InputType.TYPE_CLASS_TEXT);
                // Enable the openBtn,closeBtn£¬discoverBtn
                //discoverBtn.setClickable(true);
            } catch (IOException e) {
            //  System.out.println("Exception");
                Message msg = new Message();
                msg.obj = "Error! Can't connect to device. Please try again.";
                msg.what = 0;
                LinkDetectedHandler.sendMessage(msg);
                click--;
                //contentEV.setInputType(InputType.TYPE_CLASS_TEXT);
                // Enable the openBtn,closeBtn£¬discoverBtn
                //discoverBtn.setClickable(true);
            }
        }
    };

这是我的 readThread方法

private class readThread extends Thread {
        public void run() {

            byte[] buffer = new byte[1024];
            int bytes;
            InputStream mmInStream = null;
            String tmp = null;
            try {
                mmInStream = socket.getInputStream();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            while (true) {
                try {
                    // read the data from the inputStream 
                    if ((bytes = mmInStream.read(buffer)) > 0) 
                    {
                        for (int i = 0; i < bytes; i++) {
                            tmp = "" + buffer[i];
                            String st = new String(tmp);
                            tmp = null;
                            Message msg = new Message();
                            msg.obj = st;
                            msg.what = 1;

                        }
                    }
                } catch (IOException e) {
                    try {
                        mmInStream.close();
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                    break;
                }
            }
        }
    }

3 个答案:

答案 0 :(得分:0)

来自javadoc:

  

public byte [] getBytes()

     

使用平台将此String编码为字节序列   默认字符集,将结果存储到新的字节数组中。

因此,当您默认情况下调用getBytes时,您的“T&#39;编码为0x54(参见此处的完整表:http://unicode-table.com/en/)如果你想要别的东西写你自己的getBytes()函数。

答案 1 :(得分:0)

getBytes方法的变体可以指定用于编码的Charset。如果您需要使用平台未提供的字符集,则必须自己实施。有关详细信息,请参阅the documentation

答案 2 :(得分:0)

Java使用内部Unicode,因此它可以组合世界上的所有脚本。 Unicode是所有字符的编号,最多为3字节范围内的数字。它有几个字节表示,最重要的是:多字节UTF-8,多字UTF-16LE,UTF16-BE。

在Unicode a中有代码U + 61(十六进制),它是97十进制或\u0061(正如您在java中编写的那样)。

  • 一对一的Unicode用法是使用java 代码点int,32位。
  • Java内部做出妥协并使用16位的UTF-16 char。 有时需要几个字符来表示一个代码点。
  • 二进制数据位于byte[]中,并且始终采用某种编码方式。

因此文本(内部,隐藏,Unicode)之间存在分离:

  • String,char
  • 读者,作家

和二进制数据:

  • 字节[]
  • InputStream,OutputStream

二进制数据需要将某些编码解释为文本。

  • new OutputStreamWriter(outputStream,encoding)
  • new InputStreamReader(inputStream,encoding)
  • new String(bytes,encoding)
  • String.getBytes(编码)

遗憾的是,这些方法在没有编码的情况下使用版本进行了重载,采用了默认的平台编码。哪个不便携。

现在,如果你搜索ASCII,ISO-8859-1(Latin-1)和Windows-1252(Windows Latin-1),你会看到a始终是数字97,就像在Unicode中一样。

<强> 答案

在您使用操作系统编码的情况下,字节是Unicode字符的转换。在这种情况下,转换是身份映射。但请尝试ĉeĥo(&#34;捷克语&#34;在世界语中)。

String s = "\u0109e\u0125o"; // "ĉeĥo"
s.getBytes(StandardCharsets.UTF_8);
s.getBytes(StandardCharsets.ISO_8859_1); // Not representable
s.getBy\u0074es("Windows-1252"); // Not representable