字符串的左位旋转

Left bit rotation of a string Objective C

本文关键字:旋转 字符串      更新时间:2023-10-16

我已经给出了以下C++函数来做字符串的左位旋转,我需要在Objective C中实现它(显然我已经在底部添加了日志位):

void left_rotate ( uint16_t *in,
              uint16_t *out,
              int16_t   len,
              int16_t   shift )
{
    int16_t i, j;
    j = (len / 2) - 1;
    for (i = 0; i < (len / 2); i++) {
        out[i] = (uint16_t) (in[i] << shift);
        if (i < j) {
            out[i] |= in[i + 1] >> ((int16_t) len - shift);
        } else {
            out[i] |= in[0] >> ((int16_t) len - shift);
        }
    }
    NSLog(@"In: %hd", (short)in);
    NSLog(@"Out: %hd", (short)out);
    unsigned char * char1 = out;
    NSLog(@"Char: %s", char1);
    NSData * data1 = [[NSData alloc] initWithBytes:char1 length:sizeof(char1)];
    NSLog(@"Data: %@", data1);
}

然而,我不完全确定它应该如何工作。我试着这样称呼它:

NSString * originStringData = @"acf7183f7673200BBA7719775b20393c4487fa008e13542f4013eb9b2eb7490e";
NSString * RotateNumber = @"0003";
NSData *data = originStringData;
NSUInteger len = [data length];
Byte *byteData = (Byte*)malloc(len);
memcpy(byteData, [data bytes], len);
for(int i=0; i<sizeof(byteData); i++)
{
    u_int16_t data2 = byteData[i];
    int16_t shift1 = (short)[RotateNumber intValue];
    u_int16_t out1;
    left_rotate(&data2, &out1, sizeof(byteData),shift1);
}

返回:

<60055600><b8077b00><c1001c00><f9011f00>

我实际想要的字符串是:

67b8c1fbb399005dd3b8cbbad901c9e2243fd004709aa17a009f5cd975ba4875

我需要做的是通过Rotate Number在原始字符串上执行左位旋转。我现在愿意尝试任何事情,所以任何帮助都会很感激,我有点卡住了!

干杯!

亚当

似乎left_rotate不像你想的那样工作。你可以这样写你自己的旋转函数(它按照你想要的方式工作):

#import <Foundation/Foundation.h>
char char_to_hex(char ch)
{
    char* table = "0123456789abcdef";
    char* str = strchr(table, tolower(ch));
    if(str == NULL)
        return -1;
    return str - table;
}
NSString* left_rotate(NSString* source, NSUInteger shift)
{
    if(shift >= [source length] * 4)
    {
        shift %= ([source length] * 4);
    }
    NSInteger index = shift / 4;
    NSString* tmp = [source substringFromIndex:index];
    NSString* left = [source substringToIndex:index+1];
    tmp = [tmp stringByAppendingString:left];
    shift %= 4;
    //get the internal pointer;
    const char* data = [tmp cStringUsingEncoding:NSASCIIStringEncoding];
    NSString* result = [[NSString alloc] init];
    for(NSInteger i = 0; i < strlen(data) - 1; i++)
    {
        char ch1 = char_to_hex(data[i]);
        char ch2 = char_to_hex(data[i+1]);
        if(ch1 < 0 || ch2 < 0)
            return nil;
        char ch = ((ch1 << shift) | (ch2 >> (4 - shift))) & 0xF;
        result = [result stringByAppendingFormat:@"%x", ch];
    }
    return result;
}
int main(int argc, const char * argv[]) {
    NSString* source = @"acf7183f7673200BBA7719775b20393c4487fa008e13542f4013eb9b2eb7490e";
    NSString* result = left_rotate(source, 3);
    NSLog(@"result:%@", result);
    return 0;
}

我相信你传递错误的类型到你的函数,你想转换你的NSString*int16的数组之前,你正在做什么,然而,只是复制字节代表字符串。

简单地说,如果你复制代表"1"的byes,你不会得到等同于1的,你必须添加一些转换。

以下内容(没有错误处理,假设您的输入中有很多内容,请适应!)

for (NSUInteger i = 0; i < originStringData.length; ++i {
    unichar oneChar = [originStringData characterAtIndex:i];
    if (isnumber(oneChar)) {
        byteData[i] = oneChar - '0';
    } else {
        byteData[i] = oneChar - 'a' + 10;
    }
}

最重要的是你想为你的out分配一些空间,你传递一个指针到单个int16,分配另一个相同大小的数组并传递它。