[SabreAMF] SabreAMF and ByteArray

Jim Mischel jim at mischel.com
Tue Nov 14 17:26:32 EST 2006


Evert

Thanks.  I should have thought of the class-wrapper.

I've included sample ActionScript code that creates an object containing 
a ByteArray, and the resulting AMF dump.

        // Create the object
        var id: int = 23;
        var command: String = "test";
        var bytes:ByteArray = new ByteArray();
        bytes.writeUTFBytes("this is a test");

        var testo: Object = {id:id, command:command, bytes:bytes, 
xxx:"jim"};

The resulting dump:

0000: 0A 0B 01 0F 63 6F 6D 6D - 61 6E 64 06 09 74 65 73   ....command..tes
0010: 74 05 69 64 04 17 07 78 - 78 78 06 07 6A 69 6D 0B   t.id...xxx..jim.
0020: 62 79 74 65 73 0C 1D 74 - 68 69 73 20 69 73 20 61   bytes..this.is.a
0030: 20 74 65 73 74 01       -                           .test...........

If you're going to get to this quickly, I'll hold off on coding it up 
myself.

Jim

Evert | Rooftop wrote:

> The best way to do something like this is a class-wrapper, because I 
> think 'magic' behaviour is a really bad thing..
>
> So.. this would be something like:
>
> $byteArray = new SabreAMF_ByteArray($data);
>
> If you can give me an AMF sample, I can probably implement this pretty 
> quickly.
>
> Evert
>
> Jim Mischel wrote:
>
>> SabreAMF does not currently support AMF type 0x0C, which is a Flash 
>> ByteArray.  Looking at a dump of the AMF created when I pass a 
>> ByteArray, it appears that the ByteArray format is very similar to 
>> the String format.  That is, 0x0C followed by an integer-data length, 
>> followed by the bytes in the array.  As with Strings, the low bit of 
>> the length determines whether it's a literal ByteArray or a reference 
>> to a previous ByteArray.
>>
>> It would be simple enough to code up something that reads this data 
>> type, but there's a problem:  there is no PHP data type that 
>> corresponds to a ByteArray.  It appears that I can use a PHP string 
>> to hold the bytes, but that becomes problematic on serialization.  If 
>> the serializer sees a string, how does it know whether output it as a 
>> String (type 0x06) or a ByteArray (type 0x0C)?  Being something of a 
>> PHP novice, I could be missing something.  But there doesn't appear 
>> to be a distinct PHP data type that I can use for the ByteArray.
>>
>> The solution I stumbled on was to mangle the name of the ByteArray 
>> when I read it.  For example, if I get a ByteArray field called 
>> 'data', I mangle the name by adding (prepending or appending) 
>> something to the field name.  'data', for example, would become 
>> 'data_BA' (for ByteArray).  This, of course, requires that I either 
>> mangle every field name by adding its type, or tell clients that they 
>> can't use variables that end in '_BA' (or whatever the mangling 
>> characters are).
>>
>> The other problem with this approach is ... mangled names.  And 
>> mangled names are a serious pain to work with, as we discovered years 
>> ago when working with the Hungarian notation so common in old-style 
>> Windows programming.  lpszFileName, and all that rot.
>>
>> Any thoughts on this one?  Suggestions how to handle ByteArray?
>>
>> Jim
>>
>>
>>
>>
>> _______________________________________________
>> sabreamf mailing list
>> sabreamf at osflash.org
>> http://osflash.org/mailman/listinfo/sabreamf_osflash.org
>>   
>
>
>
>





More information about the sabreamf mailing list