Avatar billede loukas Mester
20. marts 2013 - 14:30 Der er 7 kommentarer og
1 løsning

php Serialize med ASP

Jeg skal have kodet en løsning i ASP til http://smartsend.dk/ så der kan printes pakkelabels ud.

Jeg har noget php-kode som skal laves om til ASP.

Den linie som driller er:
$pacsoftUser['check'] = md5(serialize(array(0 => $pacsoft, 1 => $pacsoftUser['key'], 2=> $pacsoftUser['smartsendID'])));

Jeg har prøvet med:
smartsendID = 111
key = "xxxp4wbvyg2t9j8nmlp1z2fb80dxxx"
strChek = MD5(key & smartsendID)

MD5 functionen har jeg fra http://www.frez.co.uk/vb6.aspx
Men jeg er ikke med på hvad serialize gør.
Avatar billede michael_stim Ekspert
20. marts 2013 - 14:45 #1
Avatar billede loukas Mester
20. marts 2013 - 17:39 #2
Jeg har fundet den her javakode: http://www.phprpc.org/en/download/
Men hvordan bruger jeg den?

var PHPSerializer = (function () {

    function freeEval(s) {
        return eval(s);
    }
    var prototypePropertyOfArray = function() {
        var result = {};
        for (var p in []) {
            result[p] = true;
        }
        return result;
    }();
    var prototypePropertyOfObject = function() {
        var result = {};
        for (var p in {}) {
            result[p] = true;
        }
        return result;
    }();

    return {
        serialize : function(o) {
            var p = 0, sb = [], ht = [], hv = 1;
            function getClassName(o) {
                if (typeof(o) == 'undefined' || typeof(o.constructor) == 'undefined') return '';
                var c = o.constructor.toString();
                c = c.substr(0, c.indexOf('(')).replace(/(^\s*function\s*)|(\s*$)/ig, '').toUTF8();
                return ((c == '') ? 'Object' : c);
            }
            function isInteger(n) {
                var i, s = n.toString(), l = s.length;
                if (l > 11) return false;
                for (i = (s.charAt(0) == '-') ? 1 : 0; i < l; i++) {
                    switch (s.charAt(i)) {
                        case '0':
                        case '1':
                        case '2':
                        case '3':
                        case '4':
                        case '5':
                        case '6':
                        case '7':
                        case '8':
                        case '9': break;
                        default : return false;
                    }
                }
                return !(n < -2147483648 || n > 2147483647);
            }
            function inHashTable(o) {
                for (var i = 0; i < ht.length; i++) if (ht[i] === o) return i;
                return false;
            }
            function serializeNull() {
                sb[p++] = 'N;';
            }
            function serializeBoolean(b) {
                sb[p++] = (b ? 'b:1;' : 'b:0;');
            }
            function serializeInteger(i) {
                sb[p++] = 'i:' + i + ';';
            }
            function serializeDouble(d) {
                if (isNaN(d)) d = 'NAN';
                else if (d == Number.POSITIVE_INFINITY) d = 'INF';
                else if (d == Number.NEGATIVE_INFINITY) d = '-INF';
                sb[p++] = 'd:' + d + ';';
            }
            function serializeString(s) {
                var utf8 = s.toUTF8();
                sb[p++] = 's:' + utf8.length + ':"';
                sb[p++] = utf8;
                sb[p++] = '";';
            }
            function serializeDate(dt) {
                sb[p++] = 'O:11:"PHPRPC_Date":7:{';
                sb[p++] = 's:4:"year";';
                serializeInteger(dt.getFullYear());
                sb[p++] = 's:5:"month";';
                serializeInteger(dt.getMonth() + 1);
                sb[p++] = 's:3:"day";';
                serializeInteger(dt.getDate());
                sb[p++] = 's:4:"hour";';
                serializeInteger(dt.getHours());
                sb[p++] = 's:6:"minute";';
                serializeInteger(dt.getMinutes());
                sb[p++] = 's:6:"second";';
                serializeInteger(dt.getSeconds());
                sb[p++] = 's:11:"millisecond";';
                serializeInteger(dt.getMilliseconds());
                sb[p++] = '}';
            }
            function serializeArray(a) {
                sb[p++] = 'a:';
                var k, lp = p;
                sb[p++] = 0;
                sb[p++] = ':{';
                for (k in a) {
                    if ((typeof(a[k]) != 'function') && !prototypePropertyOfArray[k]) {
                        isInteger(k) ? serializeInteger(k) : serializeString(k);
                        serialize(a[k]);
                        sb[lp]++;
                    }
                }
                sb[p++] = '}';
            }
            function serializeObject(o) {
                var cn = getClassName(o);
                if (cn == '') serializeNull();
                else if (typeof(o.serialize) != 'function') {
                    sb[p++] = 'O:' + cn.length + ':"' + cn + '":';
                    var lp = p;
                    sb[p++] = 0;
                    sb[p++] = ':{';
                    var k;
                    if (typeof(o.__sleep) == 'function') {
                        var a = o.__sleep();
                        for (k in a) {
                            serializeString(a[k]);
                            serialize(o[a[k]]);
                            sb[lp]++;
                        }
                    }
                    else {
                        for (k in o) {
                            if (typeof(o[k]) != 'function' && !prototypePropertyOfObject[k]) {
                                serializeString(k);
                                serialize(o[k]);
                                sb[lp]++;
                            }
                        }
                    }
                    sb[p++] = '}';
                }
                else {
                    var cs = o.serialize();
                    sb[p++] = 'C:' + cn.length + ':"' + cn + '":' + cs.length + ':{' +cs + '}';
                }
            }
            function serializePointRef(R) {
                sb[p++] = 'R:' + R + ';';
            }
            function serializeRef(r) {
                sb[p++] = 'r:' + r + ';';
            }
            function serialize(o) {
                if (typeof(o) == "undefined" || o == null ||
                    o.constructor == Function) {
                    hv++;
                    serializeNull();
                    return;
                }
                var className = getClassName(o);
                switch (o.constructor) {
                    case Boolean: {
                        hv++;
                        serializeBoolean(o);
                        break;
                    }
                    case Number: {
                        hv++;
                        isInteger(o) ? serializeInteger(o) : serializeDouble(o);
                        break;
                    }
                    case String: {
                        hv++;
                        serializeString(o);
                        break;
                    }
                    case Date: {
                        hv += 8;
                        serializeDate(o);
                        break;
                    }
                    default: {
                        if (className == "Object" || o.constructor == Array) {
                            var r = inHashTable(o);
                            if (r) {
                                serializePointRef(r);
                            }
                            else {
                                ht[hv++] = o;
                                serializeArray(o);
                            }
                            break;
                        }
                        else {
                            var r = inHashTable(o);
                            if (r) {
                                hv++;
                                serializeRef(r);
                            }
                            else {
                                ht[hv++] = o;
                                serializeObject(o);
                            }
                        }
                    }
                }
            }
            serialize(o);
            return sb.join('');
        },
        unserialize : function(ss) {
            var p = 0, ht = [], hv = 1;
            function unserializeNull() {
                p++;
                return null;
            }
            function unserializeBoolean() {
                p++;
                var b = (ss.charAt(p++) == '1');
                p++;
                return b;
            }
            function unserializeInteger() {
                p++;
                var i = parseInt(ss.substring(p, p = ss.indexOf(';', p)));
                p++;
                return i;
            }
            function unserializeDouble() {
                p++;
                var d = ss.substring(p, p = ss.indexOf(';', p));
                switch (d) {
                    case 'NAN': d = NaN; break;
                    case 'INF': d = Number.POSITIVE_INFINITY; break;
                    case '-INF': d = Number.NEGATIVE_INFINITY; break;
                    default: d = parseFloat(d);
                }
                p++;
                return d;
            }
            function unserializeString() {
                p++;
                var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
                p += 2;
                var s = ss.substring(p, p += l).toUTF16();
                p += 2;
                return s;
            }
            function unserializeEscapedString(len) {
                p++;
                var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
                p += 2;
                var i, sb = new Array(l);
                for (i = 0; i < l; i++) {
                    if ((sb[i] = ss.charAt(p++)) == '\\') {
                        sb[i] = String.fromCharCode(parseInt(ss.substring(p, p += len), 16));
                    }
                }
                p += 2;
                return sb.join('');
            }
            function unserializeArray() {
                p++;
                var n = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
                p += 2;
                var i, k, a = [];
                ht[hv++] = a;
                for (i = 0; i < n; i++) {
                    switch (ss.charAt(p++)) {
                        case 'i': k = unserializeInteger(); break;
                        case 's': k = unserializeString(); break;
                        case 'S': k = unserializeEscapedString(2); break;
                        case 'U': k = unserializeEscapedString(4); break;
                        default: return false;
                    }
                    a[k] = unserialize();
                }
                p++;
                return a;
            }
            function unserializeDate(n) {
                var i, k, a = {};
                for (i = 0; i < n; i++) {
                    switch (ss.charAt(p++)) {
                        case 's': k = unserializeString(); break;
                        case 'S': k = unserializeEscapedString(2); break;
                        case 'U': k = unserializeEscapedString(4); break;
                        default: return false;
                    }
                    if (ss.charAt(p++) == 'i') {
                        a[k] = unserializeInteger();
                    }
                    else {
                        return false;
                    }
                }
                p++;
                var dt = new Date(
                    a.year,
                    a.month - 1,
                    a.day,
                    a.hour,
                    a.minute,
                    a.second,
                    a.millisecond
                );
                ht[hv++] = dt;
                ht[hv++] = a.year;
                ht[hv++] = a.month;
                ht[hv++] = a.day;
                ht[hv++] = a.hour;
                ht[hv++] = a.minute;
                ht[hv++] = a.second;
                ht[hv++] = a.millisecond;
                return dt;
            }
            function unserializeObject() {
                p++;
                var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
                p += 2;
                var cn = ss.substring(p, p += l).toUTF16();
                p += 2;
                var n = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
                p += 2;
                if (cn == "PHPRPC_Date") {
                    return unserializeDate(n);
                }
                var i, k, o = createObjectOfClass(cn);
                ht[hv++] = o;
                for (i = 0; i < n; i++) {
                    switch (ss.charAt(p++)) {
                        case 's': k = unserializeString(); break;
                        case 'S': k = unserializeEscapedString(2); break;
                        case 'U': k = unserializeEscapedString(4); break;
                        default: return false;
                    }
                    if (k.charAt(0) == '\0') {
                        k = k.substring(k.indexOf('\0', 1) + 1, k.length);
                    }
                    o[k] = unserialize();
                }
                p++;
                if (typeof(o.__wakeup) == 'function') o.__wakeup();
                return o;
            }
            function unserializeCustomObject() {
                p++;
                var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
                p += 2;
                var cn = ss.substring(p, p += l).toUTF16();
                p += 2;
                var n = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
                p += 2;
                var o = createObjectOfClass(cn);
                ht[hv++] = o;
                if (typeof(o.unserialize) != 'function') p += n;
                else o.unserialize(ss.substring(p, p += n));
                p++;
                return o;
            }
            function unserializeRef() {
                p++;
                var r = parseInt(ss.substring(p, p = ss.indexOf(';', p)));
                p++;
                return ht[r];
            }
            function getObjectOfClass(cn, poslist, i, c) {
                if (i < poslist.length) {
                    var pos = poslist[i];
                    cn[pos] = c;
                    var obj = getObjectOfClass(cn, poslist, i + 1, '.');
                    if (i + 1 < poslist.length) {
                        if (obj == null) {
                            obj = getObjectOfClass(cn, poslist, i + 1, '_');
                        }
                    }
                    return obj;
                }
                var classname = cn.join('');
                try {
                    return freeEval('new ' + classname + '()');
                }
                catch (e) {
                    return null;
                }
            }
            function createObjectOfClass(classname) {
                if (freeEval('typeof(' + classname + ') == "function"')) {
                    return freeEval('new ' + classname + '()');
                }
                var poslist = [];
                var pos = classname.indexOf("_");
                while (pos > -1) {
                    poslist[poslist.length] = pos;
                    pos = classname.indexOf("_", pos + 1);
                }
                if (poslist.length > 0) {
                    var cn = classname.split('');
                    var obj = getObjectOfClass(cn, poslist, 0, '.');
                    if (obj == null) {
                        obj = getObjectOfClass(cn, poslist, 0, '_');
                    }
                    if (obj != null) {
                        return obj;
                    }
                }
                return freeEval('new function ' + classname + '(){};');
            }
            function unserialize() {
                switch (ss.charAt(p++)) {
                    case 'N': return ht[hv++] = unserializeNull();
                    case 'b': return ht[hv++] = unserializeBoolean();
                    case 'i': return ht[hv++] = unserializeInteger();
                    case 'd': return ht[hv++] = unserializeDouble();
                    case 's': return ht[hv++] = unserializeString();
                    case 'S': return ht[hv++] = unserializeEscapedString(2);
                    case 'U': return ht[hv++] = unserializeEscapedString(4);
                    case 'r': return ht[hv++] = unserializeRef();
                    case 'a': return unserializeArray();
                    case 'O': return unserializeObject();
                    case 'C': return unserializeCustomObject();
                    case 'R': return unserializeRef();
                    default: return false;
                }
            }
            return unserialize();
        }
    }
})();
Avatar billede olebole Juniormester
20. marts 2013 - 19:10 #3
<ole>

Det er nu ikke Java, men JavaScript - som er et helt andet sprog  =)

Hvad koden angår, så undlad at bruge den. Den gør brug af yderst usikre features, som absolut må frarådes. Det gælder brugen af eval og new Function.

PHP-koden her:

$pacsoft = 'foo';
$pacsoftUser = array(
    'key' => 'bar',
    'smartsendID' => 'baz'
);

$foobar = serialize(array(0 => $pacsoft, 1 => $pacsoftUser['key'], 2=> $pacsoftUser['smartsendID']));
echo $foobar;

- udskriver strengen:

a:3:{i:0;s:3:"foo";i:1;s:3:"bar";i:2;s:3:"baz";}

Eller mere overskueligt stillet op:
a:3:{
  i:0;s:3:"foo";
  i:1;s:3:"bar";
  i:2;s:3:"baz";
}

a for array
3 for antal elementer
i/0 for index
s for streng
3 antal tegn i streng
"foo" selve strengen

Mon så ikke du selv kan skrive en kode, som kan sammensætte strengen udfra dine variabler?

/mvh
</bole>
Avatar billede olebole Juniormester
20. marts 2013 - 19:18 #4
PS: Havde PHP-array'et set sådan ud:

$pacsoftUser = array(
    'key' => 123,
    'smartsendID' => 'baz'
);

- ville den serialiserede streng se sådan ud:

a:3:{i:0;s:3:"foo";i:1;i:123;i:2;s:3:"baz";}

Eller:
a:3:{
    i:0;s:3:"foo";
    i:1;i:123;
    i:2;s:3:"baz";
}

i for integer
- og ingen gåseøjne om selve tallet
Avatar billede olebole Juniormester
20. marts 2013 - 19:25 #5
Den serialiserede strengs syntaks forklaret
Avatar billede loukas Mester
20. marts 2013 - 21:34 #6
Tak til dig olebole.
Smid et svar så lukker jeg den.
Avatar billede olebole Juniormester
20. marts 2013 - 21:49 #7
Ellers tak, jeg samler ikke point. Bare læg et svar selv og accepter det, så tråden lukkes  =)
Avatar billede loukas Mester
20. marts 2013 - 21:58 #8
Ok, tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester