【问题标题】:Parsing a NSString to a byte array将 NSString 解析为字节数组
【发布时间】:2013-01-17 06:09:54
【问题描述】:

我需要将 NSString 解析为字节数组,但在执行此操作时遇到了一些麻烦。我在方法中有一个填充字节数组并将其转换为可变字符串,然后我有一个方法需要将这些数字放回字节数组中。 在 C# 中,它很简单:

do
{
    val = byte.Parse(str.Substring(i, 3));
    byteArr[j++] = val;
    i += 3;
}

这里是代码片段 注意**我在 do 循环中尝试了很多不同的东西,所以现在那里一团糟:

-(NSData*) StrToByteArray: (NSString*)str 
{
    NSLog(@"StrToByteArray. String: %@", str);
    if([str length]==0)
       NSLog(@"Invailid String");
    int val;
    Byte byteArr[[str length]/3];
    int i = 0;
    int j = 0;
    NSRange range; 
    do {
       range = NSMakeRange(i, 3);
       val = (int)[str substringFromIndex:i];
       NSLog(@"StrToByteArray. VAR: %i", val);
       byteArr[j++] = val;
       NSLog(@"byteArr: %i",byteArr[i]);
       i+=3;
    }while(i<str.length);
    NSData* wrappedByteArr = [NSData dataWithBytes:&byteArr length: sizeof(byteArr)];
    return wrappedByteArr;
}

这是制作填充字符串的循环:

for(int i = 0; i<=len;i++)
{
    val = byteArr[i];
    NSLog(@"byteArr to string original: %i", val);
    if(val<(Byte)10)
    {
        [tempStr appendString:(@"00")];
        [tempStr appendString:[NSString stringWithFormat:@"%d",val]];
    }
    else if(val<(Byte)100)
    {
        [tempStr appendString:(@"0")];
        [tempStr appendString:[NSString stringWithFormat:@"%d",val]];
    }
    else {

        [tempStr appendString:[NSString stringWithFormat:@"%d",val]];
    }

}
NSLog(@"string: %@", tempStr);
return tempStr;

【问题讨论】:

  • 对不起,我发布了一个答案,但没有意识到你在做什么。您是说您的字符串实际上包含诸如“123255000123”之类的数字,并且您想将其转换为四个字节,123、255、000 和 123?你能显示你想转换成数据的字符串吗?
  • 没错,字符串是238095076083154150180036184206087006249074132222096
  • 所以基本上,您想一次迭代字符串 3 个字符,并且每次迭代都取这三个字符的整数值,并将其设置为字节数组中索引的值?

标签: ios objective-c macos


【解决方案1】:

采取 2

现在我知道数据是什么样子以及您想如何解析它,我会这样处理它:

- (NSData *) parseStringToData:(NSString *) str
{
    if ([str length] % 3 != 0)
    {
        // raise an exception, because the string's length should be a multiple of 3.
    }

    NSMutableData *result = [NSMutableData dataWithLength:[str length] / 3];
    unsigned char *buffer = [result mutableBytes];

    for (NSUInteger i = 0; i < [result length]; i++)
    {
        NSString *byteString = [str substringWithRange:NSMakeRange(i * 3, 3)];
        buffer[i] = [byteString intValue];
    }

    return result;
}

编辑:

您的填充方法也可以通过提供自动填充整数的正确格式说明符来简化。

for(int i = 0; i<=len;i++)
{
    val = byteArr[i];
    NSLog(@"byteArr to string original: %i", val);

    [tempStr appendFormat:@"%03d", val];
}

【讨论】:

  • 你为什么不做一个合适大小的NSMutableData,然后写信给它的mutableBytes
  • @KurtRevis:因为我是一个有坏习惯的 C 程序员!好建议,我会编辑我的答案。
  • 哇,太快了,太棒了,让我试试这个,我会让你知道结果。非常感谢
  • 是的,这很好用,谢谢。我对 Objective C 还是有点陌生​​,一些 C++ 和 C# 函数转换起来很复杂。再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 2012-11-19
相关资源
最近更新 更多