一个文件,将 base64 转换为 org.w3c.dom.document 后 base64 中的不同行 Java
One file, different lines in base64 after convert base64 to org.w3c.dom.document on Java
有一个服务接收 base64 格式的 xml 文件。
例如:
PGFkcmVzc2Jvb2s+CiA8Y29udGFjdCBudW1iZXI9IjEiPgogIDxuYW1lPlBpZ2d5PC9uYW1lPgogIDxwaG9uZT4rNDkgNjMxMzIyMTg3PC9waG9uZT4KICA8ZW1haWw+cGlnZ3lAbWVnYS5kZTwvZW1haWw+CiA8L2NvbnRhY3Q+CiA8Y29udGFjdCBudW1iZXI9IjIiPgogIDxuYW1lPktlcm1pdDwvbmFtZT4KICA8cGhvbmU+KzQ5IDYzMTMyMjE4MTwvcGhvbmU+CiAgPGVtYWlsPmtlcm1pdEBtZWdhLmRlPC9lbWFpbD4KIDwvY29udGFjdD4KIDxjb250YWN0IG51bWJlcj0iMyI+CiAgPG5hbWU+R29uem88L25hbWU+CiAgPHBob25lPis0OSA2MzEzMjIxODY8L3Bob25lPgogIDxlbWFpbD5nb256b0BtZWdhLmRlPC9lbWFpbD4KIDwvY29udGFjdD4KPC9hZHJlc3Nib29rPg==
从中我得到一个 org.w3c.dom.document.
类型的对象
public static Document convertBase64ToDocument(String documentBase64) throws ResponseException {
byte[] bytes = Base64.decode(documentBase64);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
try {
DocumentBuilder builder = factory.newDocumentBuilder();
return builder.parse(new ByteArrayInputStream(bytes));
} catch (Exception e) {
ResponseException rs = new ResponseException(ExceptionMessages.ConvertException + " " + e.getMessage(),
ErrorCodes.convertExceptionCode);
xmlUtilsLogger.error(rs.getMessage() + ErrorCodes.namePrint + rs.getNumber());
throw rs;
}
}
我什么都没做,我把它转换回base64。
public static String documentToBase64(Document document) throws ResponseException {
return ObjectUtils.encodeByteToBase64(XmlUtils.documentToByteArray(document));
}
public static byte[] documentToByteArray(Document document) throws ResponseException {
try {
Source source = new DOMSource(document);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
StreamResult result = new StreamResult(bos);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.setOutputProperty(OutputKeys.INDENT, "no");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.STANDALONE, "no");
transformer.transform(source, result);
return bos.toByteArray();
} catch (TransformerException e) {
ResponseException rs = new ResponseException(ExceptionMessages.ConvertException + " " + e.getMessage(),
ErrorCodes.convertExceptionCode);
xmlUtilsLogger.error(rs.getMessage() + ErrorCodes.namePrint + rs.getNumber());
throw rs;
}
}
然后我得到修改后的 base64 字符串。
PGFkcmVzc2Jvb2s+DQogPGNvbnRhY3QgbnVtYmVyPSIxIj4NCiAgPG5hbWU+UGlnZ3k8L25hbWU+DQogIDxwaG9uZT4rNDkgNjMxMzIyMTg3PC9waG9uZT4NCiAgPGVtYWlsPnBpZ2d5QG1lZ2EuZGU8L2VtYWlsPg0KIDwvY29udGFjdD4NCiA8Y29udGFjdCBudW1iZXI9IjIiPg0KICA8bmFtZT5LZXJtaXQ8L25hbWU+DQogIDxwaG9uZT4rNDkgNjMxMzIyMTgxPC9waG9uZT4NCiAgPGVtYWlsPmtlcm1pdEBtZWdhLmRlPC9lbWFpbD4NCiA8L2NvbnRhY3Q+DQogPGNvbnRhY3QgbnVtYmVyPSIzIj4NCiAgPG5hbWU+R29uem88L25hbWU+DQogIDxwaG9uZT4rNDkgNjMxMzIyMTg2PC9waG9uZT4NCiAgPGVtYWlsPmdvbnpvQG1lZ2EuZGU8L2VtYWlsPg0KIDwvY29udGFjdD4NCjwvYWRyZXNzYm9vaz4=
外观上,xml无异
<adressbook>
<contact number="1">
<name>Piggy</name>
<phone>+49 631322187</phone>
<email>piggy@mega.de</email>
</contact>
<contact number="2">
<name>Kermit</name>
<phone>+49 631322181</phone>
<email>kermit@mega.de</email>
</contact>
<contact number="3">
<name>Gonzo</name>
<phone>+49 631322186</phone>
<email>gonzo@mega.de</email>
</contact>
</adressbook>
如您所见,未添加其他信息(transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,“是”);)。
将来,您需要从这些数据中计算出哈希值。自然就不一样了。
问题是为什么它们不同
区别在于原始字符串 (A) 的换行符编码为 LF (ASCII 0a),但结果 (B) 的换行符为 CR LF (ASCII 0d 0a)
当您转换 base64 string to HEX
时,您可以很容易地看到这一点
A: 3c616472657373626f6f6b3e0a203c636f6e
B: 3c616472657373626f6f6b3e0d0a203c636f
看起来转换器没有提供换行符选项。
有一个服务接收 base64 格式的 xml 文件。
例如:
PGFkcmVzc2Jvb2s+CiA8Y29udGFjdCBudW1iZXI9IjEiPgogIDxuYW1lPlBpZ2d5PC9uYW1lPgogIDxwaG9uZT4rNDkgNjMxMzIyMTg3PC9waG9uZT4KICA8ZW1haWw+cGlnZ3lAbWVnYS5kZTwvZW1haWw+CiA8L2NvbnRhY3Q+CiA8Y29udGFjdCBudW1iZXI9IjIiPgogIDxuYW1lPktlcm1pdDwvbmFtZT4KICA8cGhvbmU+KzQ5IDYzMTMyMjE4MTwvcGhvbmU+CiAgPGVtYWlsPmtlcm1pdEBtZWdhLmRlPC9lbWFpbD4KIDwvY29udGFjdD4KIDxjb250YWN0IG51bWJlcj0iMyI+CiAgPG5hbWU+R29uem88L25hbWU+CiAgPHBob25lPis0OSA2MzEzMjIxODY8L3Bob25lPgogIDxlbWFpbD5nb256b0BtZWdhLmRlPC9lbWFpbD4KIDwvY29udGFjdD4KPC9hZHJlc3Nib29rPg==
从中我得到一个 org.w3c.dom.document.
类型的对象 public static Document convertBase64ToDocument(String documentBase64) throws ResponseException {
byte[] bytes = Base64.decode(documentBase64);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
try {
DocumentBuilder builder = factory.newDocumentBuilder();
return builder.parse(new ByteArrayInputStream(bytes));
} catch (Exception e) {
ResponseException rs = new ResponseException(ExceptionMessages.ConvertException + " " + e.getMessage(),
ErrorCodes.convertExceptionCode);
xmlUtilsLogger.error(rs.getMessage() + ErrorCodes.namePrint + rs.getNumber());
throw rs;
}
}
我什么都没做,我把它转换回base64。
public static String documentToBase64(Document document) throws ResponseException {
return ObjectUtils.encodeByteToBase64(XmlUtils.documentToByteArray(document));
}
public static byte[] documentToByteArray(Document document) throws ResponseException {
try {
Source source = new DOMSource(document);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
StreamResult result = new StreamResult(bos);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.setOutputProperty(OutputKeys.INDENT, "no");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.STANDALONE, "no");
transformer.transform(source, result);
return bos.toByteArray();
} catch (TransformerException e) {
ResponseException rs = new ResponseException(ExceptionMessages.ConvertException + " " + e.getMessage(),
ErrorCodes.convertExceptionCode);
xmlUtilsLogger.error(rs.getMessage() + ErrorCodes.namePrint + rs.getNumber());
throw rs;
}
}
然后我得到修改后的 base64 字符串。
PGFkcmVzc2Jvb2s+DQogPGNvbnRhY3QgbnVtYmVyPSIxIj4NCiAgPG5hbWU+UGlnZ3k8L25hbWU+DQogIDxwaG9uZT4rNDkgNjMxMzIyMTg3PC9waG9uZT4NCiAgPGVtYWlsPnBpZ2d5QG1lZ2EuZGU8L2VtYWlsPg0KIDwvY29udGFjdD4NCiA8Y29udGFjdCBudW1iZXI9IjIiPg0KICA8bmFtZT5LZXJtaXQ8L25hbWU+DQogIDxwaG9uZT4rNDkgNjMxMzIyMTgxPC9waG9uZT4NCiAgPGVtYWlsPmtlcm1pdEBtZWdhLmRlPC9lbWFpbD4NCiA8L2NvbnRhY3Q+DQogPGNvbnRhY3QgbnVtYmVyPSIzIj4NCiAgPG5hbWU+R29uem88L25hbWU+DQogIDxwaG9uZT4rNDkgNjMxMzIyMTg2PC9waG9uZT4NCiAgPGVtYWlsPmdvbnpvQG1lZ2EuZGU8L2VtYWlsPg0KIDwvY29udGFjdD4NCjwvYWRyZXNzYm9vaz4=
外观上,xml无异
<adressbook>
<contact number="1">
<name>Piggy</name>
<phone>+49 631322187</phone>
<email>piggy@mega.de</email>
</contact>
<contact number="2">
<name>Kermit</name>
<phone>+49 631322181</phone>
<email>kermit@mega.de</email>
</contact>
<contact number="3">
<name>Gonzo</name>
<phone>+49 631322186</phone>
<email>gonzo@mega.de</email>
</contact>
</adressbook>
如您所见,未添加其他信息(transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,“是”);)。
将来,您需要从这些数据中计算出哈希值。自然就不一样了。 问题是为什么它们不同
区别在于原始字符串 (A) 的换行符编码为 LF (ASCII 0a),但结果 (B) 的换行符为 CR LF (ASCII 0d 0a)
当您转换 base64 string to HEX
时,您可以很容易地看到这一点A: 3c616472657373626f6f6b3e0a203c636f6e
B: 3c616472657373626f6f6b3e0d0a203c636f
看起来转换器没有提供换行符选项。