一段java代码求转化成OC代码 急急急

jinebi9487 2017-05-05 06:14:53
public static String decrypt(String fileUrl, int keyLength)
throws Exception {
File file = new File(fileUrl);
if (!file.exists()) {
return null;
}
InputStream is = new FileInputStream(fileUrl);
ByteArrayOutputStream out = new ByteArrayOutputStream();

byte[] buffer = new byte[1024];
byte[] buffer2 = new byte[1024];
byte bMax = (byte) 255;
long size = file.length() - keyLength;
int mod = (int) (size % 1024);
int div = (int) (size >> 10);
int count = mod == 0 ? div : (div + 1);
int k = 1, r;
r = is.read(buffer);
while ((k <= count && (r = is.read(buffer)) > 0)) {
if (mod != 0 && k == count) {
r = mod;
}

for (int i = 0; i < r; i++) {
byte b = buffer[i];
buffer2[i] = b == 0 ? bMax : --b;
}
out.write(buffer2, 0, r);
k++;
}
out.close();
is.close();
return new String(out.toByteArray());
}
...全文
412 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinebi9487 2017-05-18
  • 打赏
  • 举报
回复
贴一下自己写的方法: - (NSMutableData *)decodewithData:(NSString *)fileStr key:(NSString *)key { NSData *encodeData = [NSData dataWithContentsOfFile:fileStr]; NSOutputStream *fs = [[NSOutputStream alloc] initToMemory]; [fs open]; int bMax = 255; long size = encodeData.length - key.length; int mod = (int) (size % 1024); int div = (int) (size >> 10); int count = mod == 0 ? div : (div + 1); int k = 1; NSInteger r; NSInputStream *reads = [[NSInputStream alloc] initWithData:encodeData]; [reads open]; uint8_t buffer[1024]; uint8_t buffer2[1024]; while ((k <= count && (r = [reads read:buffer maxLength:1024]) > 0)) { if (mod != 0 && k == count) { r = mod; } Byte *bufferData = (Byte*)malloc(r); memcpy(bufferData, buffer, r); for (int i = 0; i < r; i++) { int b = bufferData[i]; buffer2[i] = b == 0 ? bMax: --b; } [fs write:buffer2 maxLength:r]; k++; } [reads close]; [fs close]; NSMutableData *decodeData = [fs propertyForKey:NSStreamDataWrittenToMemoryStreamKey]; return decodeData; }
jinebi9487 2017-05-18
  • 打赏
  • 举报
回复
@alby 谢谢解答,今天又看了一下之前的转换代码发现确实是多写了一行( r = fread(buffer, BufferSize, 1, file); // 前1024字节读完就扔?确定Java的算法没问题?) 去掉之后已经可以运行了.
大个啊 2017-05-08
  • 打赏
  • 举报
回复
// 代码没经过测试
// 版本1(不建议用该版本)
+ (NSString *)decryptWithFileUrl1:(NSString *)fileUrl keyLength:(int)keyLength {

const int BufferSize = 1024;

FILE *file = fopen([fileUrl UTF8String], "r");
if(file == NULL) {
return nil;
}
char buffer[BufferSize];
char bMax = (Byte)255;
long size = fseek(file, 0L, SEEK_END) - keyLength;
char buffer2[size + 1]; // 这里假设了文件不大,数据全放在栈上。如果文件太大,放在堆上吧
fseek(file, 0L, SEEK_SET);

// 计算读取次数,多余
int mod = (int) (size % BufferSize);
int div = (int) (size >> 10);
int count = mod == 0 ? div : (div + 1);
int k = 1;
ssize_t r;
r = fread(buffer, BufferSize, 1, file); // 前1024字节读完就扔?确定Java的算法没问题?
int buffer2Offset = 0;
while ((k <= count && (r = fread(buffer, BufferSize, 1, file)) > 0)) {
if (mod != 0 && k == count) {
r = mod;
}

for (int i = 0; i < r; i++) {
Byte b = buffer[i];
buffer2[buffer2Offset + i] = b == 0 ? bMax : --b;
}
buffer2Offset += r;
k++;
}
buffer2[buffer2Offset + 1] = '\0';

fclose(file);

return [NSString stringWithUTF8String:(const char *)buffer2];
}

// 版本2
+ (NSString *)decryptWithFileUrl:(NSString *)fileUrl keyLength:(int)keyLength {

const int BufferSize = 1024;

FILE *file = fopen([fileUrl UTF8String], "r");
if(file == NULL) {
return nil;
}
char buffer[BufferSize];
char bMax = (Byte)255;
long size = fseek(file, 0L, SEEK_END) - keyLength;
char buffer2[size + 1]; // 这里假设了文件不大,数据全放在栈上。如果文件太大,放在堆上吧
fseek(file, 0L, SEEK_SET);

ssize_t r;
r = fread(buffer, BufferSize, 1, file); // 前1024字节读完就扔?确定Java的算法没问题?
int buffer2Offset = 0;
while ((r = fread(buffer, BufferSize, 1, file)) > 0) {
for (int i = 0; i < r; i++) {
Byte b = buffer[i];
buffer2[buffer2Offset + i] = b == 0 ? bMax : --b;
}
buffer2Offset += r;
}
buffer2[buffer2Offset + 1] = '\0';

fclose(file);

return [NSString stringWithUTF8String:(const char *)buffer2];
}

29,030

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧