【问题标题】:How to convert NSString to bytes array [duplicate]如何将NSString转换为字节数组[重复]
【发布时间】:2013-09-19 15:45:47
【问题描述】:

我想将 NSString 转换为字节数组。这就是我在 Java 上所做的:

private static final String myString = ">9:2212!>3415!2345611<::156:66>12:6569;6154!<2!6!!:32!!>!943252<3:1;:>214964?6?;!?6:343564:64!93";

byte byteArr[] = toBytes(myString);

static byte[] toBytes(String s) {
        int size = s.length();
        byte bytes[] = new byte[size / 2];
        int i = 0;
        for(int j = 0; i < size; j++)
        {
            bytes[j] = (byte)((s.charAt(i) & 0xf) << 4 | s.charAt(++i) & 0xf);
            i++;
        }

        return bytes;
 }

这返回给我类似:[b3k2da311

我尝试使用 [myString UTF8String],但它基本上返回相同的字符串。我需要类似上面的代码。

【问题讨论】:

  • 您希望字节采用什么编码? UTF8,16,32 ASCII?
  • UTF8。 dataUsingEncoding 和 UTF8String 可能不是我想要的。
  • 我认为你想要 UTF-16BE - Android 的字符串是 UTF16 BE
  • 这个问题不是stackoverflow.com/questions/881482/nsstring-into-bytes-array的重复,需要的转换不是简单的“将NSString转换为UTF-8”看Java代码示例。

标签: java objective-c nsstring bytearray


【解决方案1】:

您的代码似乎采用了字符串中每个字符的最低四位并将它们打包到字节数组中。这对我来说似乎有点奇怪,但这是直接翻译(没有错误:))。

static NSString* const myString = @"whatever";

// In some method

// Class methods are roughly equivalent to static methods in Java
NSData* byteArray = [[self class] toBytes: myString];

// Method definition
// The result is encapsulated in a NSData to take advantage of ARC for memory management
+ (NSData*) toBytes: (NSString*) aString
{
    NSUInteger size = [aString length];
    NSMutableData bytes = [NSMutableData dataWithLength: size / 2];
    // Get a pointer to the actual array of bytes
    uint8_t* bytePtr = [bytes mutableBytes];
    NSUInteger i = 0;
    // NB your code had a bug in that an exception is thrown if size is odd
    for (NSUInteger j = 0 ; j < size / 2 ; ++j)
    {
        bytePtr[j] = (([aString characterAtIndex: i] & 0xf) << 4)
                   | ([aString characterAtIndex: i + 1] & 0xf);
       i += 2;
    }
    // NSMutableData is a subclass of NSData, so return it directly.
    return bytes;
}

【讨论】:

    【解决方案2】:

    NSString 有一个方法调用UTF8String 会返回const char *

    • (const char *)UTF8String

    您可以在此处找到文档:

    NSString Documentation

    【讨论】:

    • 之前试过了,但是基本上返回的都是一样的字符串。 NSString *myString = @"&gt;9:2212!&gt;3415!2345611&lt;::156:66&gt;12:6569;6154!&lt;2!6!!:32!!&gt;!943252&lt;3:1;:&gt;214964?6?;!?6:343564:64!93"; NSLog(@"myString: %s", [myString UTF8String]); myString: >9:2212!>3415!2345611<::156:66>12:6569;6154!!943252214964?6 ?;!?6:343564:64!93
    【解决方案3】:

    您可能想花一点时间了解字符编码,以免这不是巫术魔法。 ;-)

    NSData* data = [theString dataWithEncoding: NSUTF16BigEndianStringEncoding]; const char* bytes = (const char*)data.bytes;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 2012-04-12
      相关资源
      最近更新 更多