我正在尝试开发一个 Android 应用程序,我需要在字符串中添加一个字节值(8 位)并在 byte[] 中再次读取它。
但是,当我再次使用 getBytes() 将字符串转换为 byte[] 时,我得到了一些不同的值。我认为这是一些编码或字符集问题。
顺便说一句,我是 Java 编程新手,我主要用 C 编写代码。
代码:
void function(void)
{
String a = "bla";
char x = (0xD0 & 0xFF); //Need to add & read back '0xD0'
a += x;
Log.d(TAG,"TEST: "+a);
String mm = "-- ";
byte[] buffer = null;
try {
buffer = a.getBytes("US-ASCII");
} catch (UnsupportedEncodingException e) {
Log.e(TAG, e.getMessage());
}
for (int i = 0; i < buffer.length; i++) {
mm+=" "+Integer.toHexString( buffer[i] );
}
Log.e(TAG, "Len:"+buffer.length+mm);
}
输出:
TEST: bla
Len:4-- 62 6c 61 3f
预期:
Len:4-- 62 6c 61 d0
<小时/>
找到解决办法:
现在我使用编码UTF-16LE
,它不会丢失数据,并且传输偶数字节,跳过奇数字节
解决方案:
void function(void)
{
String a = "bla";
char x = 0xD0;
a += x;
Log.d(TAG,"TEST: "+a);
String mm = "-- ";
byte[] buffer = null;
try {
buffer = a.getBytes("UTF-16LE");
} catch (UnsupportedEncodingException e) {
Log.e(TAG, e.getMessage());
}
for (int i = 0; i < buffer.length; ) {
mm += i +":"+Integer.toHexString( buffer[i] ) + ",";
/* Skip odd bytes as using "UTF-16LE" encoding */
i+=2;
}
Log.e(TAG, "Len:"+buffer.length+mm);
}
结果:
Len:8-- 0:62,2:6c,4:61,6:ffffffd0,
最佳答案
创建 java 时,他们区分了二进制数据(byte[]、InputStream、OutputStream
)和Unicode 文本(字符串、字符、读取器、写入器
)。这意味着byte
是8位,char
是16位,包含UTF-16。现在,UTF-16 对 Unicode 文本进行编码 - 其中字符(“代码点”)编号为 3 字节范围 - 其格式有时需要两个 2 字节字符。总而言之,您不能使用任意字符。而且隐式或显式转换的成本总是很高。
最好使用 ByteArrayInputStream 和 ByteArrayOutputStream,它们可用于收集可变数量的字节,然后检索 byte[]
。
如果仍然希望存在,您可以从 ISO-8859-1 等 1 字节编码进行转换。
String s = "blah\u00d0";
String s = "blah" + '\u00d0';
String s = "blah" + ((char)0x00d0); // < 0x100 still in safe range
byte[] b = s.getBytes("ISO-8859-1");
s = new String(b, "ISO-8859-1");
与 C 的另一个区别是 \u0000
是字符串中的普通字符。
关于java - 如何在 Java 中将字节值(8 位)添加到字符串并以字节形式读回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36649026/