Re: Best Way to Append Bytes With Encoding To CFMutableString
Le 31 mars 2012 à 18:20, Andreas Grosam a écrit :
Thank you all for your answers and suggestions.
My use case is to create CFStrings from Unicode - which in the majority of cases are "short" strings - say, less than 100 characters. In this case, I create an immutable CFString directly in one go.
Less frequently in the typical use case of the application, I have to deal with larger strings, say base64 encoded images, or something like this. Yet, I need to create a CFString. Since the content will be received over the net, I naturally get content in chunks anyway (namely NSData objects received from a connection). So, in order to avoid a large temporary buffer which holds the complete string, I use a smaller buffer, e.g. 4 KByte and then append this small buffer to the resulting CFString, until it is complete.
If this is to store base64, I would rather use NSData instead of NSString, and even better, I would use a staged base64 decoder that let me decode the data when they arrive, and store the result in NSMutableData
As Greg suggested, I'll try my solution first and test whether it will work efficiently:
CFStringRef tmp = CFStringCreateWithBytesNoCopy(kCFAllocatorDefault, bytes, numBytes, encoding, NO, kCFAllocatorNull); CFStringAppend(myMutableString, tmp); CFRelease(tmp);
Nonetheless, if there is a chance that a possible implementation
void CFStringAppendBytes ( CFMutableStringRef theString, const void* bytes, CFIndex numBytes, CFStringEncoding encoding );
will be faster, or uses less memory, I'll also file an enhancement request.
Thanks All!
Regards Andreas
On Mar 28, 2012, at 9:24 PM, Greg Parker wrote:
On Mar 28, 2012, at 11:00 AM, Charles Srstka <cocoadev@charlessoft.com> wrote:
Unicode NULL is the least of your problems. In UTF16, each character in the normal ASCII range is going to contain a zero as one of its two bytes (which one, of course, depending on whether the encoding is big- or little-endian). CFStringAppendCString(), along with the other functions that take C strings, stops at the first zero byte it hits, which means that unless your entire file is in a non-Western script, it’s going to get cut short.
CFStringAppendCString() is not what you want if you might be using UTF16.
That's right. The first thing CFStringAppendCString() does is call strlen().
CoreFoundation does have a function internally that would do what you want. You could file a bug report asking for a new API to match. However, it requires almost as much work as using a temporary CFString object anyway, except in some ASCII and UTF-16 cases. I would not expect your CFStringCreateWithBytesNoCopy() solution to be much slower unless you're performing a large number of short appends with one of CFString's preferred encodings.
-- Greg Parker gparker@apple.com Runtime Wrangler
_______________________________________________
Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription: https://lists.apple.com/mailman/options/cocoa-dev/devlists%40shadowlab.org
This email sent to devlists@shadowlab.org
-- Jean-Daniel _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: https://lists.apple.com/mailman/options/cocoa-dev/site_archiver%40lists.appl... This email sent to site_archiver@lists.apple.com
participants (1)
-
Jean-Daniel Dupas