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
