请各位同仁帮我解释一下 ,下面的代码
public void sendString(PrintStream outstream, String string) {
// TODO Auto-generated method stub
try {
outstream.println(string.length());
int len = string.length() * 2;
byte buf[] = new byte[len];
for (int i = 0; i < string.length(); i++) {
buf[i * 2] = (byte) (string.charAt(i) >> 8);
buf[i * 2 + 1] = (byte) string.charAt(i);

outstream.write(buf, 0, len);//将 len 字节从指定的初始偏移量为 0 的字节数组写入此流。
outstream.flush();
} catch (Exception e) {
offline = true;
System.out.println("   sendString() error:" + e);
}
}

解决方案 »

  1.   

    public void sendString(PrintStream outstream, String string) {
    try {
    // 将字符串的长度写入并换行
    outstream.println(string.length());
    int len = string.length() * 2;
    // 定义一个字符串2倍长度的字节数组
    byte buf[] = new byte[len];
    for (int i = 0; i < string.length(); i++) {
    // 如果是偶数的位置就向右移动8位,即偶数的地方放null
    buf[i * 2] = (byte) (string.charAt(i) >> 8);
    // 在奇数的位置放数据
    buf[i * 2 + 1] = (byte) string.charAt(i);
    }
    // 写入
    outstream.write(buf, 0, len);// 将 len 字节从指定的初始偏移量为 0 的字节数组写入此流。
    outstream.flush();
    } catch (Exception e) {
    // offline = true;
    System.out.println("       sendString()   error:" + e.getMessage());
    }
      

  2.   

    方法名为sendStirng,传进来两个参数,一个是输出流类型,一个是String类型
    先打印出字符串长度,然后开一个byte数组buf,长度是String的长度乘以2,
    做一个循环,执行次数为string的长度,取stirng中位置为i的字符,将其右移8位,转换成byte类型后赋给buf中下标为偶数的元素,
    取stirng中位置为i的字符,转换成byte类型后赋给buf中下标为奇数的元素,
    从buf的起始位置开始将其写入到输出流中,写得长度是len,之后输出,最后捕捉异常关于右移运算:
    value >> num
    这里,num 指定要移位值value 移动的位数。也就是,右移运算符>>使指定值的所有位都右移num位。
    用二进制表示该过程可以更清楚地看到程序的运行过程:
    00100011   35  
    >> 2  
    00001000   8
    将值每右移一次,就相当于将该值除以2并且舍弃了余数。
    右移时,被移走的最高位(最左边的位)由原来最高位的数字补充。
      

  3.   

    算术右移位运算(有符号右移) 表达式"a>>b"
    --------------
    例:
    12>>2
    --------------
    12的二进制形式:
    ...32 16 8 4 2 1
    ...0  0  1 1 0 0
    --------------
    12右移2位
    ...0  0  1 1 0 0
    ...0 0 0 0 0 1 1
    二进制11就是整数3
    --------------
    所以
    12>>2 的结果等于 3
    12>>1 的结果等于 6