JAVA C++风格的byte字符串转换为String字符串问题

yu_xm 2013-01-30 04:19:02
移植C++代码到JAVA中,遇到下面这样的问题,请大家帮忙看看:
byte b[] = new byte[500*1024];
读二进制的文件到数组b中,文件里面有部分unicode编码的中文字符,
现知道数组中第101个字符开始是中文,数值依次如下95,108,-49,-126,0,0(“江苏”的unicode编码,JAVA中没无符号byte,所以有负数,0,0表示结束),请帮忙实现把这6个元素转换为String,便于显示。

C++中很方面 char* pStr = &b[100];这样就可以了,JAVA中怎么操作呢,能直接把这几个字符写到String对应的内存中吗?
...全文
311 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
nmyangym 2013-02-20
  • 打赏
  • 举报
回复
引用 3 楼 yu_xm 的回复:
nmyangym给的方法可以解决问题 不要下面2行也可以, bytes[0]=-2; //-2 对应fe,-1对应ff. 后面要交换,所以保存 fe,ff. bytes[1]=-1; 为什么要高低位互换呢? bytes[i+2]=b[i+1]; ……
是我理解的肤浅。 "江"字的unicode编码为:6c5f,分两个字节存储为:6c,5f(10进制表示为108,95)。 如果在数组里存储的顺序也是这样的,也就是高位在前,低位在后,这样可以直接进行转换。 看下面的代码:

public class ByteArrayToUnicodeHighLow
{
    public static void main(String[] args) throws Exception
    {
        //高位在前,低位在后,可直接转
	//
        byte[] origin = {108,95};//108-->6c; 95-->5f
        String unicodeString = new String(origin,"unicode");
        System.out.println(unicodeString);
    }
}
/*
 * 江
 */
或者在数组的头加两个字节:fe,ff也可以。 看下面的代码:

public class ByteArrayToUnicodeHighLow1
{
    public static void main(String[] args) throws Exception
    {
        //高位在前,低位在后,数组前加两个字节ff,fe也可以。
	//
        byte[] origin = {-2,-1,108,95};//-2-->fe; -1-->ff; 108-->6c; 95-->5f
        String unicodeString = new String(origin,"unicode");
        System.out.println(unicodeString);
    }
}
/*
 * 江
 */
如果在数组里的存储顺序为5f,6c,也就是低位在前,高位在后,那么在转换时必需在数组的前两个字节放置ff,fe. 否则,出错。看下面的代码:


public class ByteArrayToUnicodeLowHigh
{
    public static void main(String[] args) throws Exception
    {
        //低位在前,高位在后,不可直接转,直接转出现错误.
	//
        byte[] origin = {95,108};// 95-->5f; 108-->6c;
        String unicodeString = new String(origin,"unicode");
        System.out.println(unicodeString);
    }
}
/*
 * 彬  //错误输出
 */
必需在数组前加上ff,fe(-1,-2),才能得到正确结果:


public class ByteArrayToUnicodeLowHigh1
{
    public static void main(String[] args) throws Exception
    {
        //低位在前,高位在后,不可直接转,直接转出现错误,数组前加上ff,fe即可。
	//
        byte[] origin = {-1,-2,95,108};// -1-->ff; -2-->fe; 95-->5f; 108-->6c
        String unicodeString = new String(origin,"unicode");
        System.out.println(unicodeString);
    }
}
/*
 * 江
 */
楼主给出的顺序是低位在前,高位在后,所以可以在数组前加上ff,fe转换,或者把顺序改过来直接转换。也就是楼主说的,不需要加前面的fe ff也正常。
yu_xm 2013-02-19
  • 打赏
  • 举报
回复
nmyangym给的方法可以解决问题 不要下面2行也可以, bytes[0]=-2; //-2 对应fe,-1对应ff. 后面要交换,所以保存 fe,ff. bytes[1]=-1; 为什么要高低位互换呢? bytes[i+2]=b[i+1]; bytes[i+3]=b[i];
nmyangym 2013-01-30
  • 打赏
  • 举报
回复
楼主看行不?

public class ByteArrayToUnicode
{
	public static void main(String[] args) throws Exception
	{
		byte[] origin=new byte[500*1024];//模拟数据。
		origin[101]=95;
		origin[102]=108;
		origin[103]=-49;
		origin[104]=-126;
		origin[105]=0;
		origin[106]=0;

		byte[] b=new byte[6];
		System.arraycopy(origin,101,b,0,b.length);

		String unicodeString=null;
		unicodeString=byteToUnicode(b);
		System.out.println(unicodeString);
	}

	//把字节数组转换成字符串。
	//
	public static String byteToUnicode(byte[] b) throws Exception
	{
		byte[] bytes=new byte[b.length];	//是存放unicode 编码头(ff,fe)
		bytes[0]=-2;				//-2  对应fe,-1对应ff. 后面要交换,所以保存 fe,ff.
		bytes[1]=-1;
		for(int i=0; i<(b.length-2);i+=2)	//两个字节交替放入数组.放完后是{208,95,-126,-49} 后面的0不处理。
		{
            bytes[i+2]=b[i+1];
            bytes[i+3]=b[i];
		}
		String result=new String(bytes,"Unicode");
		return result;
	}
}
zxhcloth 2013-01-30
  • 打赏
  • 举报
回复
String有个构造方法 String(byte bytes[], int offset, int length) 用在你这就是: String str = new String(b, 100, b.length-100);

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧