java - 如何在 Java 中将字节值(8 位)添加到字符串并以字节形式读回

标签 java android

我正在尝试开发一个 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/

相关文章:

android - MvvmCross:Android应用程序属性

javascript - React Native : In an array of Text Inputs which are looped then displayed, 如何获取第n个元素并分别修改这些元素?

java - 我可以在 Android 中部分更改此文本的颜色吗?

java - 为什么java没有确定性析构函数?

java - 如何在 Java 中序列化和反序列化 RSA KeyPair

java - 相机预览颠倒

Android Studio 模拟器不显示小部件

java - 使用 Android fragment 获取 mysql 数据库信息

java - 为什么最后包含点的目录名被视为目录,即使在 Java 中使用 File 对象不存在?

java - eclipse 和路径