Alright,

Here is the ticket: https://www.macruby.org/trac/ticket/732

-carl

On Fri, May 28, 2010 at 1:59 PM, Laurent Sansonetti
<[email protected]> wrote:
> I see... you're right.  I guess adding a #to_data method makes sense then. 
> Could you file a ticket on trac?
>
> I believe the method should only work for Ruby strings and raise an exception 
> for NSStrings.
>
> Laurent
>
> On May 28, 2010, at 1:41 PM, Carl Lerche wrote:
>
>> 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
>
> _______________________________________________
> 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