Laurent,

There is no NS* encoding that will correctly return the data from the
ASCII-8BIT encoded string without mangling it (as far as I could
figure out at least, I spent a good deal of time trying to).
Basically, there was no way to get a data object using the NSString
data* methods. My general understanding is that cocoa stores NSStrings
internally as unicode. I have no idea how macruby maps ruby's
ASCII-8BIT encoding -> unicode, but there is no way to get the data
back in the original form (round trip).

If there is something that I missed, please let me know.

Thanks,
-carl

On Fri, May 28, 2010 at 1:33 PM, Laurent Sansonetti
<[email protected]> wrote:
> Hi Carl,
>
> Why not using -[NSString dataUsingEncoding:]? It would be better perf wise 
> than constructing a bytes array like you do.
>
> As Josh mentioned, the fact that the String class can hold arbitrary data 
> (not only characters) is a design issue of Ruby that we unfortunately need to 
> follow for compatibility purposes. Fortunately, all Ruby strings in MacRuby 
> are NSStrings and the Cocoa APIs can be easily used to retrieve NSData 
> objects.
>
> I thought about adding a convenience method on String to return NSDatas, but 
> Strings already respond to dataUsingEncoding: , so I'm not sure if another 
> method is needed. On the other side, NSData objects respond to #to_str which 
> returns a Ruby string (with BINARY encoding).
>
> Laurent
>
> On May 28, 2010, at 10:03 AM, Carl Lerche wrote:
>
>> Hello,
>>
>> I've been playing around with macruby a bunch and I hit a point of
>> confusion. I basically did "....".pack("H*") which returns a ruby
>> string. This string is an ASCII-8BIT encoded ruby string which is an
>> alias for a Binary string (aka, it has no encoding). IMO, this should
>> really be backed by an NSData class as opposed to an NSString class
>> because it doesn't make much sense. In fact, it's pretty much
>> impossible to get any useful information out of an ASCII-8BIT encoded
>> ruby string from the objective-c side of things.
>>
>> To get around this, I did the following:
>>
>> class String
>>  def to_data
>>    return NSData.data unless length > 0
>>
>>    bytes = self.bytes.to_a
>>    p = Pointer.new_with_type("char *", bytes.length)
>>
>>    bytes.each_with_index do |char, i|
>>      p[i] = char
>>    end
>>
>>    NSData.dataWithBytes(p, length:bytes.length)
>>  end
>> end
>>
>> I'm not sure what the solution to this is, but I thought I'd bring up
>> the issue on the mailing list.
>>
>> Thanks,
>> -carl
>> _______________________________________________
>> MacRuby-devel mailing list
>> [email protected]
>> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
>
> _______________________________________________
> MacRuby-devel mailing list
> [email protected]
> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
>
_______________________________________________
MacRuby-devel mailing list
[email protected]
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel

Reply via email to