XSLT: الحصول على أو مطابقة التجزئة لبيانات المشفرة Base64

StackOverflow https://stackoverflow.com/questions/1684963

سؤال

أحتاج إلى إيجاد طريقة لإيجاد طريقة للعثور على التجزئة البيانات المشفرة Base64 في عقدة XML // ملاحظة / الموارد / البيانات, ، أو بطريقة ما بطريقة أخرى تطابقها إلى قيمة التجزئة في العقدة // ملاحظة / المحتوى / en-note // en-media @ hash

انظر أدناه لملف XML الكامل

يرجى اقتراح وسيلة إلى {الحصول على | المباراة} باستخدام XSLT.

4aaafc3e14314027bb1d89cf7d59a06c

{من | مع}

R0lGODlhEAAQAPMAMcDAwP/crv/erbigfVdLOyslHQAAAAECAwECAwECAwECAwECAwECAwECAwEC
AwECAyH/C01TT0ZGSUNFOS4wGAAAAAxtc09QTVNPRkZJQ0U5LjAHgfNAGQAh/wtNU09GRklDRTku
MBUAAAAJcEhZcwAACxMAAAsTAQCanBgAIf8LTVNPRkZJQ0U5LjATAAAAB3RJTUUH1AkWBTYSQXe8
fQAh+QQBAAAAACwAAAAAEAAQAAADSQhgpv7OlDGYstCIMqsZAXYJJEdRQRWRrHk2I9t28CLfX63d
ZEXovJ7htwr6dIQB7/hgJGXMzFApOBYgl6n1il0Mv5xuhBEGJAAAOw==

من الواضح أن ملف XML عينة من الواضح أنه قد تم قطعه للإيجاز / البساطة. قد يحتوي الفعل الفعلي على> صورة واحدة لكل ملاحظة، وبالتالي الحاجة إلى الحصول على / تطابق التجزئة.

ملف XML:

<?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">
            <p>Some text here (followed by the picture)
            <p><en-media hash="4aaafc3e14314027bb1d89cf7d59a06c" type="image/gif" border="0" width="16" height="16" alt="A picture"/></p>
            <p>Some more text here (preceded by the picture)
        </en-note>
    ]]></content>
    <created>20090925T063154Z</created>
    <note-attributes>
        <author/>
    </note-attributes>
    <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>
</note>

</en-export>

حلول تنفيذ

باستخدام مفهوم الحل المقترح من قبل جاكيم. وبعد الفرق الرئيسي هو أنني أتجنب إنشاء فئة Java الخاصة بي (وإنشاء تبعية إضافية). أفعل المعالجة داخل XSLT، لأنه على التوالي إلى الأمام بما فيه الكفاية، المراجع فقط التبعيات الخارجية التي تأتي مع مكتبات Java الأساسية.
حل جاكيم هو الأصح نظرا لأنه لا يفقد الصفر الرئيسي في بعض التجزئة، إلا أنني وجدت أنه كان من الأسهل بكثير الاعتناء بهذا في مكان آخر باستخدام القراصنة الأساسية LI'L.

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    ...
    xmlns:md5="java.security.MessageDigest"
    xmlns:bigint="java.math.BigInteger"
    exclude-result-prefixes="md5 bigint">
...
<xsl:for-each select="resource">
    <xsl:variable name="md5inst" select="md5:getInstance('MD5')" />
    <xsl:value-of select="md5:update($md5inst, $b64bin)" />
    <xsl:variable name="imgmd5bytes" select="md5:digest($md5inst)" />
    <xsl:variable name="imgmd5bigint" select="bigint:new(1, $imgmd5bytes)" />
    <xsl:variable name="imgmd5str" select="bigint:toString($imgmd5bigint, 16)" />
    <!-- NOTE: $imgmd5str loses the leading zero from imgmd5bytes (if there is one) -->
</xsl:for-each>
...

ملاحظة: سؤال الأخ من أجل تنفيذي ل base64-->image file التحويل


هذا السؤال هو ضمير سؤال آخر لقد طلبت سابقا.

هل كانت مفيدة؟

المحلول

لسؤالك المتعلق حول القيام فك التشفير Base64 في XSLT، لديك قبلت الإجابة التي تستخدم سكسونية وملحقات جافا. لذلك أفترض أنك بخير باستخدام تلك.

في هذه الحالة، يمكنك إنشاء ملحق في Java لتحسين مبلغ MD5:

package com.stackoverflow.q1684963;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Sum {
    public static String calc(byte[] data) throws NoSuchAlgorithmException {
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        byte[] digest = md5.digest(data);
        BigInteger digestValue = new BigInteger(1, digest);
        return String.format("%032x", digestValue);
    } 
}

من ورقة أنماط XSLT 2.0 التي تديرها مع ساكسون، يمكنك بعد ذلك استدعاء هذا التمديد. على افتراض أن لديك بالفعل بيانات فك شفرة Base64 (على سبيل المثال من وظيفة الملحق saxon:base64Binary-to-octets كما هو الحال في الإجابة المرتبطة) في متغير data:

<xsl:value-of xmlns:md5sum="com.stackoverflow.q1684963.MD5Sum"
              select="md5sum:calc($data)"/>

نصائح أخرى

  • قم بتنزيل بعض Base64 Decoder مثل هذا أو استخدم بعض التعليمات البرمجية المصدر من الويب لهذا
  • ملف الإخراج هو some_file.gif، 268 بايت، أيقونة مجلد
  • توليد المجموع الاختباري MD5 لهذا الملف باستخدام MD5SUM. أو مرة أخرى بعض التعليمات البرمجية المصدر من الويب

الإخراج بالنسبة لي:

4aaafc3e14314027bb1d89cf7d59a06c

هذا ما تريد، أليس كذلك؟ سيكون من الصعب (إن لم يكن مستحيلا، وإذا كنت تسألني، بالتأكيد لا يستحق الجهد) للقيام بكل هذا في XSLT، ولكن على الأقل لديك الآن المعلومات التي تم إنشاؤها باستخدام هذا التجزئة باستخدام MD5 على ملف GIF.

ال 4aaaf... هو MD5 من البيانات الثنائية التي تحصل عليها عند فك تشفير البيانات المشفافة Base64. لا أعتقد أن لديك أي خيار سوى فك تشفير محتويات <data> عنصر وتشغيله من خلال تنفيذ MD5، والذي من الواضح أنه خارج نطاق تحول XSL. من المفترض أن نتيجة XSLT ستتم معالجة بعض الكود الأخرى، والتي يمكن استخراج الصور والتحقق منها.

ماذا عن هذا (إضافة كودم العموم إلى classpath الخاص بك):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:digest="org.apache.commons.codec.digest.DigestUtils">
  [...]
  <xsl:value-of select="digest:md5Hex('hello, world!')"/>
</xsl:stylesheet>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top