我正在使用一些示例java代码来制作md5哈希.一部分将结果从字节转换为十六进制数字的字符串:
byte messageDigest[] = algorithm.digest();
StringBuffer hexString = new StringBuffer();
for (int i=0;i<messageDigest.length;i++) {
hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
}
Run Code Online (Sandbox Code Playgroud)
但是,由于toHexString显然会从前导零中掉落,所以它并不常用.那么,从字节数组到保持前导零的十六进制字符串的最简单方法是什么?
我已经看到了几个关于如何在base64中编码图像文件的问题,但是反过来如何 - 如何从存储在XML文件中的base64字符串重构图片?
<resource>
<data encoding="base64">
R0lGODlhEAAQAPMAMcDAwP/crv/erbigfVdLOyslHQAAAAECAwECAwECAwECAwECAwECAwECAwEC
AwECAyH/C01TT0ZGSUNFOS4wGAAAAAxtc09QTVNPRkZJQ0U5LjAHgfNAGQAh/wtNU09GRklDRTku
MBUAAAAJcEhZcwAACxMAAAsTAQCanBgAIf8LTVNPRkZJQ0U5LjATAAAAB3RJTUUH1AkWBTYSQXe8
fQAh+QQBAAAAACwAAAAAEAAQAAADSQhgpv7OlDGYstCIMqsZAXYJJEdRQRWRrHk2I9t28CLfX63d
ZEXovJ7htwr6dIQB7/hgJGXMzFApOBYgl6n1il0Mv5xuhBEGJAAAOw==
</data>
<mime>image/gif</mime>
<resource-attributes>
<file-name>clip_image001.gif</file-name>
</resource-attributes>
</resource>
Run Code Online (Sandbox Code Playgroud)
鉴于上述XML节点resource
,我该如何创建clip_image001.gif
?
请建议:
请注意,它必须至少能够处理GIF和PNG文件格式.优选地,不限于任何OS.
基于Mads Hansen的解决方案.主要区别在于我net.sf.saxon.value.Base64BinaryValue
直接在我的命名空间中引用而不是使用saxon
命名空间,因为我比Saxonica网站对函数base64Binary-to-octets
和base64Binary
函数的描述更直观地理解Java API .
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:b64="net.sf.saxon.value.Base64BinaryValue"
xmlns:fos="java.io.FileOutputStream"
...
exclude-result-prefixes="b64 fos">
...
<xsl:for-each select="resource">
<xsl:variable name="b64" select="b64:new(string(data))"/>
...
<xsl:variable name="fos" select="fos:new(string($img))"/>
<xsl:value-of select="fos:write($fos, b64:getBinaryValue($b64))"/>
<xsl:value-of select="fos:close($fos)"/>
</xsl:for-each>
...
Run Code Online (Sandbox Code Playgroud)
PS请参阅兄弟问题,了解如何获取识别图像文件所需的哈希值.
我创建的两个子问题已经解决了(可以解决这个问题!),这个问题就解决了.我会将复选标记给samjudson,因为他的答案是最接近的.但是,对于实际工作的解决方案,请参阅以下子问题; 我实施的解决方案和检查的答案.
我将这个问题分成两个单独的问题,因为这是一个相当复杂的问题.答案仍然是受欢迎的.
这些问题是:
嗨,只是想知道是否有人在将Evernote的导出格式(即XML)转换为HTML(包括图片)方面取得了成功.我知道Evernote有一个导出到HTML功能,但是我最终想用它来做更多花哨的东西.
我设法只使用以下XSLT获取文本:
查看实施解决方案的子问题.
但是,这只是忽略了任何图片,这就是我需要帮助的地方.
绊脚石#1:Evernote将其图片存储为GIF或PNG,并在导出时,使用看似base64(我可能错误)将这些GIF和PNG直接嵌入XML中.我需要能够重建图片.如果您在文本编辑器中打开文件,请在中查找大量数据**//note/resource/data**
.例如(手动添加缩进):
<resource>
<data encoding="base64">
R0lGODlhEAAQAPMAMcDAwP/crv/erbigfVdLOyslHQAAAAECAwECAwECAwECAwECAwECAwECAwEC
AwECAyH/C01TT0ZGSUNFOS4wGAAAAAxtc09QTVNPRkZJQ0U5LjAHgfNAGQAh/wtNU09GRklDRTku
MBUAAAAJcEhZcwAACxMAAAsTAQCanBgAIf8LTVNPRkZJQ0U5LjATAAAAB3RJTUUH1AkWBTYSQXe8
fQAh+QQBAAAAACwAAAAAEAAQAAADSQhgpv7OlDGYstCIMqsZAXYJJEdRQRWRrHk2I9t28CLfX63d
ZEXovJ7htwr6dIQB7/hgJGXMzFApOBYgl6n1il0Mv5xuhBEGJAAAOw==
</data>
<mime>image/gif</mime>
<resource-attributes>
<file-name>clip_image001.gif</file-name>
</resource-attributes>
</resource>
Run Code Online (Sandbox Code Playgroud)
绊脚石#2:Evernote将每个图片的文件名存储在资源节点
**//note/resource/resource-attributes/file-name**
下,但是,在它引用图片的实际注释中,它不是通过文件名引用图片,而是通过其哈希引用图片,例如:
<en-media hash="4aaafc3e14314027bb1d89cf7d59a06c" type="image/gif" border="0" width="16" height="16" alt="Alt Text"/>
Run Code Online (Sandbox Code Playgroud)
任何人都可以阐明如何在XML中处理(base64)编码的二进制数据?
我从评论和答案中了解到,简单的'XSLT将无法完成处理图像的工作.我使用的XSLT处理器是Xalan,但是,如果这对于图像处理或base64来说还不够好,那么我建议你做一个这样做!
此外,根据要求,这是一个示例Evernote导出文件.上面的代码片段仅仅是其中的一部分.我已将其剥离,使其仅包含一个注释并编辑其中的大部分文本,并为了清晰起见添加了缩进.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export.dtd">
<en-export export-date="20091029T063411Z" application="Evernote/Windows" version="3.0">
<note>
<title>A title here</title>
<content><![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml.dtd">
<en-note bgcolor="#FFFFFF"> …
Run Code Online (Sandbox Code Playgroud)