miscmodule.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 1,774 行 · 第 1/3 页

JAVA
1,774
字号
    }        @Override    public int pack(Env env, StringValue bb, int i, Value []args)      throws IOException    {      Value arg;      if (i < args.length) {	arg = args[i];	i++;      }      else {	env.warning("a: not enough arguments");	return i;      }      StringValue s = arg.toStringValue();      int strlen = s.length();      if (_length == Integer.MAX_VALUE) {      }      else if (strlen < _length) {	env.warning("not enough characters in hex string");	return i;      }      else if (_length < strlen)	strlen = _length;            int tail = strlen / 2;      for (int j = 0; j < tail; j++) {	int d = 0;		char ch = s.charAt(2 * j);	d += 16 * hexToDigit(env, ch);		ch = s.charAt(2 * j + 1);	d += hexToDigit(env, ch);	bb.appendByte(d);      }            if ((strlen & 1) == 1) {	int d = 16 * hexToDigit(env, s.charAt(strlen - 1));	bb.appendByte(d);      }      return i;    }        @Override    public void unpack(Env env, ArrayValue result, InputStream is)      throws IOException    {      StringValue sb = new StringBuilderValue();      for (int i = _length / 2 - 1; i >= 0; i--) {	int ch = is.read();	sb.append(digitToHex(ch >> 4));	sb.append(digitToHex(ch));      }      result.put(_name, sb);    }  }  static class RevHexPackSegment extends PackSegment {    private final StringValue _name;    private final int _length;    RevHexPackSegment(int length)    {      this("", length);    }    RevHexPackSegment(String name, int length)    {      _name = new StringBuilderValue(name);      _length = length;    }        @Override    public int pack(Env env, StringValue bb, int i, Value []args)      throws IOException    {      Value arg;      if (i < args.length) {	arg = args[i];	i++;      }      else {	env.warning("a: not enough arguments");	return i;      }      StringValue s = arg.toStringValue();      int strlen = s.length();      if (_length == Integer.MAX_VALUE) {      }      else if (strlen < _length) {	env.warning("not enough characters in hex string");	return i;      }      else if (_length < strlen)	strlen = _length;            int tail = strlen / 2;      for (int j = 0; j < tail; j++) {	int d = 0;		char ch = s.charAt(2 * j);	d += hexToDigit(env, ch);		ch = s.charAt(2 * j + 1);	d += 16 * hexToDigit(env, ch);	bb.appendByte(d);      }            if ((strlen & 1) == 1) {	int d = hexToDigit(env, s.charAt(strlen - 1));	bb.appendByte(d);      }      return i;    }        @Override    public void unpack(Env env, ArrayValue result, InputStream is)      throws IOException    {      StringValue sb = new StringBuilderValue();      for (int i = _length / 2 - 1; i >= 0; i--) {	int ch = is.read();	sb.append(digitToHex(ch));	sb.append(digitToHex(ch >> 4));      }      result.put(_name, sb);    }  }  static class BigEndianPackSegment extends PackSegment {    private final String _name;    private final int _length;    private final int _bytes;    private final boolean _isSigned;    BigEndianPackSegment(int length, int bytes)    {      _name = "";      _length = length;      _bytes = bytes;      _isSigned = false;    }    BigEndianPackSegment(String name, int length, int bytes, boolean isSigned)    {      _name = name;      _length = length;      _bytes = bytes;      _isSigned = isSigned;    }        @Override    public int pack(Env env, StringValue bb, int i, Value []args)      throws IOException    {      for (int j = 0; j < _length; j++) {	Value arg;	if (i < args.length) {	  arg = args[i];	  i++;	}	else if (_length == Integer.MAX_VALUE)	  return i;	else {	  env.warning("a: not enough arguments");	  return i;	} 	long v = arg.toLong();	for (int k = _bytes - 1; k >= 0; k--) {	  bb.appendByte((int) (v >> (8 * k)));	}      }      return i;    }        @Override    public void unpack(Env env, ArrayValue result, InputStream is)      throws IOException    {      for (int j = 0; j < _length; j++) {	Value key;	// XXX: check key type with unicode semantics	if (_name.length() == 0)	  key = LongValue.create(j + 1);	else if (_length == 1)	  key = new StringBuilderValue(_name);	else {	  StringValue sb = new StringBuilderValue();	  sb.append(_name);	  sb.append(j);	  key = sb;	}		long v = 0;	for (int k = 0; k < _bytes; k++) {	  long d = is.read() & 0xff;	  	  v = (v << 8) + d;	}	if (_isSigned) {	  switch (_bytes) {	  case 1:	    v = (byte) v;	    break;	  case 2:	    v = (short) v;	    break;	  case 4:	    v = (int) v;	    break;	  }	}	result.put(key, LongValue.create(v));      }    }  }  static class LittleEndianPackSegment extends PackSegment {    private final String _name;    private final int _length;    private final int _bytes;    LittleEndianPackSegment(int length, int bytes)    {      _name = "";      _length = length;      _bytes = bytes;    }    LittleEndianPackSegment(String name, int length, int bytes)    {      _name = name;      _length = length;      _bytes = bytes;    }        @Override    public int pack(Env env, StringValue bb, int i, Value []args)      throws IOException    {      for (int j = 0; j < _length; j++) {	Value arg;	if (i < args.length) {	  arg = args[i];	  i++;	}	else if (_length == Integer.MAX_VALUE)	  return i;	else {	  env.warning("a: not enough arguments");	  return i;	} 	long v = arg.toLong();	for (int k = 0; k < _bytes; k++) {	  bb.appendByte((int) (v >> (8 * k)));	}      }      return i;    }        @Override    public void unpack(Env env, ArrayValue result, InputStream is)      throws IOException    {      for (int j = 0; j < _length; j++) {	Value key;	if (_name == "")	  key = LongValue.create(j);	else if (_length == 1)	  key = new StringBuilderValue(_name);	else {	  StringBuilderValue sb = new StringBuilderValue();	  sb.append(_name);	  sb.append(j);	  key = sb;	}		long v = 0;	for (int k = 0; k < _bytes; k++) {	  long d = is.read() & 0xff;	  v |= d << 8 * k;	}	result.put(key, LongValue.create(v));      }    }  }  static class DoublePackSegment extends PackSegment {    private final String _name;    private final int _length;    DoublePackSegment(int length)    {      this("", length);    }    DoublePackSegment(String name, int length)    {      _name = name;      _length = length;    }        @Override    public int pack(Env env, StringValue bb, int i, Value []args)      throws IOException    {      for (int j = 0; j < _length; j++) {	Value arg;	if (i < args.length) {	  arg = args[i];	  i++;	}	else if (_length == Integer.MAX_VALUE)	  return i;	else {	  env.warning("a: not enough arguments");	  return i;	} 	double d = arg.toDouble();	long v = Double.doubleToLongBits(d);	for (int k = 7; k >= 0; k--) {	  bb.appendByte((int) (v >> (8 * k)));	}      }      return i;    }        @Override    public void unpack(Env env, ArrayValue result, InputStream is)      throws IOException    {      for (int j = 0; j < _length; j++) {	Value key;	if (_name == "")	  key = LongValue.create(j);	else if (_length == 1)	  key = env.createString(_name);	else {	  StringValue sb = env.createBinaryBuilder();	  sb.append(_name);	  sb.append(j);	  key = sb;	}		long v = 0;	for (int k = 0; k < 8; k++) {	  long d = is.read() & 0xff;	  v = 256 * v + d;	}	result.put(key, new DoubleValue(Double.longBitsToDouble(v)));      }    }  }  static class FloatPackSegment extends PackSegment {    private final String _name;    private final int _length;    FloatPackSegment(int length)    {      this("", length);    }    FloatPackSegment(String name, int length)    {      _name = name;      _length = length;    }    @Override    public int pack(Env env, StringValue bb, int i, Value []args)      throws IOException    {      for (int j = 0; j < _length; j++) {	Value arg;	if (i < args.length) {	  arg = args[i];	  i++;	}	else if (_length == Integer.MAX_VALUE)	  return i;	else {	  env.warning("a: not enough arguments");	  return i;	} 	double d = arg.toDouble();	int v = Float.floatToIntBits((float) d);	for (int k = 3; k >= 0; k--) {	  bb.appendByte((int) (v >> (8 * k)));	}      }      return i;    }        @Override    public void unpack(Env env, ArrayValue result, InputStream is)      throws IOException    {      for (int j = 0; j < _length; j++) {	Value key;	if (_name == "")	  key = LongValue.create(j);	else if (_length == 1)	  key = env.createString(_name);	else {	  StringValue sb = env.createBinaryBuilder();	  sb.append(_name);	  sb.append(j);	  key = sb;	}		int v = 0;	for (int k = 0; k < 4; k++) {	  int d = is.read() & 0xff;	  v = 256 * v + d;	}	result.put(key, new DoubleValue(Float.intBitsToFloat(v)));      }    }  }  static class NullPackSegment extends PackSegment {    private final String _name;    private final int _length;    NullPackSegment(int length)    {      this("", length);    }    NullPackSegment(String name, int length)    {      _name = name;            if (length == Integer.MAX_VALUE)	length = 0;            _length = length;    }        @Override    public int pack(Env env, StringValue bb, int i, Value []args)      throws IOException    {      for (int j = 0; j < _length; j++) {	bb.appendByte(0);      }      return i;    }        @Override    public void unpack(Env env, ArrayValue result, InputStream is)      throws IOException    {      for (int i = 0; i < _length; i++)	is.read();    }  }  static class PositionPackSegment extends PackSegment {    private final int _length;    PositionPackSegment(int length)    {      this("", length);    }    PositionPackSegment(String name, int length)    {      if (length == Integer.MAX_VALUE)	length = 0;            _length = length;    }        @Override    public int pack(Env env, StringValue bb, int i, Value []args)      throws IOException    {      while (bb.length() < _length) {	bb.appendByte(0);      }      return i;    }        @Override    public void unpack(Env env, ArrayValue result, InputStream is)      throws IOException    {      throw new UnsupportedOperationException("'@' skip to position");    }  }  static int hexToDigit(Env env, char ch)  {    if ('0' <= ch && ch <= '9')      return (ch - '0');    else if ('a' <= ch && ch <= 'f')      return (ch - 'a' + 10);    else if ('A' <= ch && ch <= 'F')      return (ch - 'A' + 10);    else {      env.warning("pack: non hex digit: " + (char) ch);      return 0;    }  }  static char digitToHex(int d)  {    d &= 0xf;        if (d < 10)      return (char) ('0' + d);    else      return (char) ('a' + d - 10);  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?