现在,我对分配的工作方式感到有些困惑。 在我的代码中,没有任何变量赋值为十六进制值等等。
所以现在当打印出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;
}
}
}
}
答案 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中编写的那样)。
int
,32位。char
。
有时需要几个字符来表示一个代码点。byte[]
中,并且始终采用某种编码方式。因此文本(内部,隐藏,Unicode)之间存在分离:
和二进制数据:
二进制数据需要将某些编码解释为文本。
遗憾的是,这些方法在没有编码的情况下使用版本进行了重载,采用了默认的平台编码。哪个不便携。
现在,如果你搜索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