unsigned long 与 char 互相转换(在线等,解决即结贴给分)

wenlin56 2011-10-25 04:58:17
如题.
我是C语言白痴,但是急需要解决这个问题。

需求是这样:
void encode(char* paint, char* key) {
//转换paint为 “unsigned long” 调用encrypt
}

void encrypt(unsigned long *v) {

}
...全文
1451 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenlin56 2011-10-27
  • 打赏
  • 举报
回复
有没有热心人帮帮忙...
luciferisnotsatan 2011-10-26
  • 打赏
  • 举报
回复
v[i] = (unsigned char)cipher[i];试试
wenlin56 2011-10-26
  • 打赏
  • 举报
回复
不行啊,怎么搞啊??
wenlin56 2011-10-26
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 feidaosh 的回复:]

下班了,上来看看了,不过今天要早回家,你做的这个function其实很简单的,只是因为我不是你,所以没法放开手脚去修改。
最简单的思路就是,客房发来一个字符串,要加密后通讯或储存。那么我就根据字符串的长度(包括字符串尾的0),圆整为8的整倍数(多加出来的字节补0,因为字符串最一个字符本来就是0),另放到一个空间去,然后对这个空间数据每8个字节调一次加密函数。
加完密后,把加完密的数据和数据长……
[/Quote]
完了...肯定写不出来
我还是用c++试试
feidaosh 2011-10-26
  • 打赏
  • 举报
回复
下班了,上来看看了,不过今天要早回家,你做的这个function其实很简单的,只是因为我不是你,所以没法放开手脚去修改。
最简单的思路就是,客房发来一个字符串,要加密后通讯或储存。那么我就根据字符串的长度(包括字符串尾的0),圆整为8的整倍数(多加出来的字节补0,因为字符串最一个字符本来就是0),另放到一个空间去,然后对这个空间数据每8个字节调一次加密函数。
加完密后,把加完密的数据和数据长度(这时候不能认为这个数据还是字符串了)合成一个记录(或对象或整体或啥的,反正就是能找到长度)去通讯或储存。
解密的时候,根据储存的长度把数据读出来,每8个字节调一次解密函数,然后对解完密的数据做取字符串操作就好了。
中间没什么困难的地方。我觉得你没搞定主要是对C语言不熟,还有被那个unsigned long*, unsigned char*给迷惑了,其实这个不是重点,重点是思路对了就好了。
wenlin56 2011-10-26
  • 打赏
  • 举报
回复
路过顶
wenlin56 2011-10-26
  • 打赏
  • 举报
回复
路过顶
wenlin56 2011-10-26
  • 打赏
  • 举报
回复
多谢feidaosh了!
这个算法是根据http://hi.baidu.com/wljcom/blog/item/f3edba453264f03ccefca375.html
文章来写的...
搞不定啊
feidaosh 2011-10-25
  • 打赏
  • 举报
回复
我帮你改了一下程序,但写到解密程序时发现不对,这个思路有致命缺陷!
问题描述如下:
加密前源字符串为C字符串,可以用'\0'来确定字符串尾。
但是加密后得到的数据却不是一个标准的字符串!
例如源字符串为str={65,66,67,68,69,70,71,0};
如果加密后得到的数据为codestr={37,144,7,0,72,31,221,187};注意中间加密后有一个数据为0!
那么,你保存数据的那句话:
jstring newstring = (*env)->NewStringUTF(env, codestr);
得到的只是一部分数据,只是{37,144,7,0}转换后的结果,后面的数据因为函数检索到了一个0,认为字符串已结束而被抛弃!

这个问题我们只能明天再讨论了。
feidaosh 2011-10-25
  • 打赏
  • 举报
回复
你加我吧,你的要回答问题。。。8251597
feidaosh 2011-10-25
  • 打赏
  • 举报
回复
反应速度些啊,我还没吃饭呢,要饿死了。。。
wenlin56 2011-10-25
  • 打赏
  • 举报
回复
~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~
feidaosh 2011-10-25
  • 打赏
  • 举报
回复
不可知的比较头痛,两种解决方法,
一、输入输出分离,输入8位,输出64位,分别存储。
二、改核心加密程序为8位。
或者你给我打过来?我在上海,你打长途要钱不?我这边是公司电话,我还在公司。或者加QQ?
wenlin56 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 feidaosh 的回复:]

字符串是文件吗?长度是否可知?你那边有电话不?我这边给你打过去,打字说太慢。
[/Quote]
未知的...电话.. 不太方便..不好意思
feidaosh 2011-10-25
  • 打赏
  • 举报
回复
字符串是文件吗?长度是否可知?你那边有电话不?我这边给你打过去,打字说太慢。
wenlin56 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 feidaosh 的回复:]

你这是一个64位数据的加密程序,使用128位的KEY。。。
你现在的写法是不对的,问题很多。如果你现在在线,请回答我的问题,如5分钟内看到答案,我会回复,要不我要回家了。
问题:
你现在的需求是要把一个字符加密吗?还是一串数据?如果是一串数据,可以把你ENCODE和DECODE函数的形参改一下,这串数据长度还要求是64位的整倍数,最差也要是32位的整倍数,如果是32位的整倍数,那这串数据的……
[/Quote]
是字符串加密的
wenlin56 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 feidaosh 的回复:]

你这是一个64位数据的加密程序,使用128位的KEY。。。
你现在的写法是不对的,问题很多。如果你现在在线,请回答我的问题,如5分钟内看到答案,我会回复,要不我要回家了。
问题:
你现在的需求是要把一个字符加密吗?还是一串数据?如果是一串数据,可以把你ENCODE和DECODE函数的形参改一下,这串数据长度还要求是64位的整倍数,最差也要是32位的整倍数,如果是32位的整倍数,那这串数据的……
[/Quote]看到了
feidaosh 2011-10-25
  • 打赏
  • 举报
回复
你这是一个64位数据的加密程序,使用128位的KEY。。。
你现在的写法是不对的,问题很多。如果你现在在线,请回答我的问题,如5分钟内看到答案,我会回复,要不我要回家了。
问题:
你现在的需求是要把一个字符加密吗?还是一串数据?如果是一串数据,可以把你ENCODE和DECODE函数的形参改一下,这串数据长度还要求是64位的整倍数,最差也要是32位的整倍数,如果是32位的整倍数,那这串数据的最后一个32位就不能加密,否则会溢出。所谓的long就是32位。
如果不是一串数据,或不知道数据串长度,这个加密系统是不能直接用的,因为他直接对64位数据加密,并把加密后的数值放回了原地址中。有两个办法,一个改你的加解密核心程序,把它改成8位的;一个是把8位扩展成64位,但这样每次encode返回的就是8个字符了,而每次decode要输入8个字符,这要看你的存储方式。
你用malloc申请的内存,不能free掉,一free就什么都没了。。。
先回复看你的需求再说具体吧。
wenlin56 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 luciferisnotsatan 的回复:]

根据你说的,cipher是utf-8。没计算字符串结束符,要的话strlen()再+1就是了。
不知道这个是不是你要的意思
C/C++ code
unsigned long *v = (unsigned long*)malloc(sizeof(long)*strlen(cipher));
for(int i = 0; i < strlen(cipher);i++)
{
v[i] =……
[/Quote]
感谢,按照您的方法,已经可以编译运行了。但是转为明码后还是为乱码,估计是long转回为char的时候出了问题,麻烦您再看一下我的代码

char* decode(char* cipher, char* key) {

unsigned long *v = (unsigned long*)malloc(sizeof(long)*strlen(cipher));
unsigned long *k = (unsigned long*)malloc(sizeof(long)*strlen(key));
int i = 0;
for(i = 0; i < strlen(cipher);i++)
{
v[i] = cipher[i];
}

int j = 0;
for(j = 0; j < strlen(key);j++)
{
k[j] = key[j];
}

decrypt(v, k);

char* c = (char*)v;
free(v);
free(k);
return c;
}

char* encode(char* paint, char* key) {
unsigned long *v = (unsigned long*)malloc(sizeof(long)*strlen(paint));
unsigned long *k = (unsigned long*)malloc(sizeof(long)*strlen(key));
int i = 0;
for(i = 0; i < strlen(paint);i++)
{
v[i] = paint[i];
}

int j = 0;
for(j = 0; j < strlen(key);j++)
{
k[j] = key[j];
}


encrypt(v, k);

char* c = (char*)v;
free(v);
free(k);
return c;
}
wenlin56 2011-10-25
  • 打赏
  • 举报
回复
没搞定....高手们能不能再关注一下??谢谢大家
加载更多回复(20)

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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