📄 variantsupport.java
字号:
{ final byte[] v = new byte[l1]; for (int i = 0; i < l1; i++) v[i] = src[(int) (o1 + i)]; value = v; break; } case Variant.VT_BOOL: { /* * The first four bytes in src, from src[offset] to * src[offset + 3] contain the DWord for VT_BOOL, so * skip it, we don't need it. */ // final int first = offset + LittleEndian.INT_SIZE; long bool = LittleEndian.getUInt(src, o1); if (bool != 0) value = Boolean.TRUE; else value = Boolean.FALSE; break; } default: { final byte[] v = new byte[l1]; for (int i = 0; i < l1; i++) v[i] = src[(int) (o1 + i)]; throw new ReadingNotSupportedException(type, v); } } return value; } /** * <p>Turns a codepage number into the equivalent character encoding's * name.</p> * * @param codepage The codepage number * * @return The character encoding's name. If the codepage number is 65001, * the encoding name is "UTF-8". All other positive numbers are mapped to * "cp" followed by the number, e.g. if the codepage number is 1252 the * returned character encoding name will be "cp1252". * * @exception UnsupportedEncodingException if the specified codepage is * less than zero. */ public static String codepageToEncoding(final int codepage) throws UnsupportedEncodingException { if (codepage <= 0) throw new UnsupportedEncodingException ("Codepage number may not be " + codepage); switch (codepage) { case Constants.CP_UTF16: return "UTF-16"; case Constants.CP_UTF8: return "UTF-8"; case Constants.CP_MS949: return "ms949"; case Constants.CP_MAC_ROMAN: return "MacRoman"; case Constants.CP_MAC_JAPAN: return "SJIS"; case Constants.CP_MAC_CHINESE_TRADITIONAL: return "Big5"; case Constants.CP_MAC_KOREAN: return "EUC-KR"; case Constants.CP_MAC_ARABIC: return "MacArabic"; case Constants.CP_MAC_HEBREW: return "MacHebrew"; case Constants.CP_MAC_GREEK: return "MacGreek"; case Constants.CP_MAC_CYRILLIC: return "MacCyrillic"; case Constants.CP_MAC_CHINESE_SIMPLE: return "EUC_CN"; case Constants.CP_MAC_ROMANIA: return "MacRomania"; case Constants.CP_MAC_UKRAINE: return "MacUkraine"; case Constants.CP_MAC_THAI: return "MacThai"; case Constants.CP_MAC_CENTRAL_EUROPE: return "MacCentralEurope"; case Constants.CP_MAC_ICELAND: return "MacIceland"; case Constants.CP_MAC_TURKISH: return "MacTurkish"; case Constants.CP_MAC_CROATIAN: return "MacCroatian"; case Constants.CP_SJIS: return "SJIS"; default: return "cp" + codepage; } } /** * <p>Writes a variant value to an output stream. This method ensures that * always a multiple of 4 bytes is written.</p> * * <p>If the codepage is UTF-16, which is encouraged, strings * <strong>must</strong> always be written as {@link Variant#VT_LPWSTR} * strings, not as {@link Variant#VT_LPSTR} strings. This method ensure this * by converting strings appropriately, if needed.</p> * * @param out The stream to write the value to. * @param type The variant's type. * @param value The variant's value. * @param codepage The codepage to use to write non-wide strings * @return The number of entities that have been written. In many cases an * "entity" is a byte but this is not always the case. * @exception IOException if an I/O exceptions occurs * @exception WritingNotSupportedException if a property is to be written * who's variant type HPSF does not yet support */ public static int write(final OutputStream out, final long type, final Object value, final int codepage) throws IOException, WritingNotSupportedException { int length = 0; switch ((int) type) { case Variant.VT_BOOL: { int trueOrFalse; if (((Boolean) value).booleanValue()) trueOrFalse = 1; else trueOrFalse = 0; length = TypeWriter.writeUIntToStream(out, trueOrFalse); break; } case Variant.VT_LPSTR: { final byte[] bytes = (codepage == -1 ? ((String) value).getBytes() : ((String) value).getBytes(codepageToEncoding(codepage))); length = TypeWriter.writeUIntToStream(out, bytes.length + 1); final byte[] b = new byte[bytes.length + 1]; System.arraycopy(bytes, 0, b, 0, bytes.length); b[b.length - 1] = 0x00; out.write(b); length += b.length; break; } case Variant.VT_LPWSTR: { final int nrOfChars = ((String) value).length() + 1; length += TypeWriter.writeUIntToStream(out, nrOfChars); char[] s = Util.pad4((String) value); for (int i = 0; i < s.length; i++) { final int high = (int) ((s[i] & 0x0000ff00) >> 8); final int low = (int) (s[i] & 0x000000ff); final byte highb = (byte) high; final byte lowb = (byte) low; out.write(lowb); out.write(highb); length += 2; } out.write(0x00); out.write(0x00); length += 2; break; } case Variant.VT_CF: { final byte[] b = (byte[]) value; out.write(b); length = b.length; break; } case Variant.VT_EMPTY: { TypeWriter.writeUIntToStream(out, Variant.VT_EMPTY); length = LittleEndianConsts.INT_SIZE; break; } case Variant.VT_I2: { TypeWriter.writeToStream(out, ((Integer) value).shortValue()); length = LittleEndianConsts.SHORT_SIZE; break; } case Variant.VT_I4: { length += TypeWriter.writeToStream(out, ((Long) value).intValue()); break; } case Variant.VT_R8: { length += TypeWriter.writeToStream(out, ((Double) value).doubleValue()); break; } case Variant.VT_FILETIME: { long filetime = Util.dateToFileTime((Date) value); int high = (int) ((filetime >> 32) & 0x00000000FFFFFFFFL); int low = (int) (filetime & 0x00000000FFFFFFFFL); length += TypeWriter.writeUIntToStream (out, 0x0000000FFFFFFFFL & low); length += TypeWriter.writeUIntToStream (out, 0x0000000FFFFFFFFL & high); break; } default: { /* The variant type is not supported yet. However, if the value * is a byte array we can write it nevertheless. */ if (value instanceof byte[]) { final byte[] b = (byte[]) value; out.write(b); length = b.length; writeUnsupportedTypeMessage (new WritingNotSupportedException(type, value)); } else throw new WritingNotSupportedException(type, value); break; } } return length; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -