字符串的左位旋转
Left bit rotation of a string Objective C
我已经给出了以下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
,分配另一个相同大小的数组并传递它。