我试图使用NDK实现一个Rot13算法,对于所有不同的操作字符串缓冲区的方法,我似乎无法获得原始的字符串缓冲区,以便随着算法的进展而获得新的值。每次在linux上使用gcc时,都会使用相同的代码。我认为这可能是优化器,但是将APP_OPTIM :=调试添加到我的Android.mk中也不起作用。任何想法或帮助都会很棒!
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "FOO", __VA_ARGS__))
jbyteArray Java_NativeUtils_foo(JNIEnv* env, jobject obj, jstring item)
{
int upper, i, a, c;
char p[9];
const char *d;
//char *p = item;
const char *s = (*env)->GetStringUTFChars(env, item, 0);
//len = (*env)->GetStringUTFLength(env, item);
//** make a copy
strncpy(p, s, 8);
p[8] = '\0';
(*env)->ReleaseStringUTFChars(env, item, s);
LOGI("GG1");
LOGI(p);
for (i=0; p[i] != 0; i++) {
LOGI("GG2");
a =~ (int)p[i];
c = ~a-1 / ( ~(a|32) / 13*2-11 ) * 13;
p[i] = (char)c;
//** for log output
d = (const char *)&c;
LOGI(d);
}
LOGI("GG3");
LOGI(p);
//** convert back to a Java type
jbyteArray out = (*env)->NewByteArray(env, 8);
(*env)->SetByteArrayRegion(env, out, 0, 8, (jbyte *)p);
LOGI("GG4");
LOGI(out);
return out;
}
产出:
( 3521): GG1
( 3521): 12345693
( 3521): GG2
( 3521): 1
( 3521): GG2
( 3521): 2
( 3521): GG2
( 3521): 3
( 3521): GG2
( 3521): 4
( 3521): GG2
( 3521): 5
( 3521): GG2
( 3521): 6
( 3521): GG2
( 3521): 9
( 3521): GG2
( 3521): 3
( 3521): GG3
( 3521): 12345693
( 3521): GG4
( 3521): ??
-( 3521): Rot13 in:12345693... out:12345693...
输入与输出相同,不移13!=============== GCC版本。
#include <stdio.h>
#include <string.h>
main(int argc, char** argv) {
int upper, i, a, c;
char p[9];
char *in;
in = argv[1];
strncpy(p, in, 8);
p[8] = '\0';
printf("in ...%s... p ...%s...", in, p);
for (i=0; p[i] != 0; i++) {
a =~ (int)p[i];
c = (~a-1 / ( ~(a|32) / 13*2-11 ) * 13);
p[i] = (char)c;
}
printf("out ...%s...", p);
//while(a=~getchar())putchar(~a-1/(~(a|32)/13*2-11)*13);}
}
输出:$./a.out Freddy in ...Freddy.P ...Freddy...out ...Serqql. $./a.out Serqql在...Serqql.P ...Serqql...out ...Freddy.
发布于 2012-08-22 06:22:28
在ROT13算法中,唯一变化的字符是字母,数字保持不变。ROT13('12345693')
是等于'12345693'
。
https://stackoverflow.com/questions/11567563
复制相似问题