如何"翻转"文件的0和1

sh/bash/dash/ksh/zsh等Shell脚本
头像
yjcong
帖子: 2470
注册时间: 2006-02-28 3:11

如何"翻转"文件的0和1

#1

帖子 yjcong » 2013-04-29 16:41

保存在硬盘上的文件, 据我有限的知识, 不论是什么形式, "最终"都是0和1的组合.

那么有什么方法把某个保存在硬盘上的文件所对应的"1"在硬盘上变成"0", 把所有的"0"变成"1"呢?

C语言里貌似可以用"~"来转换变量的0和1, 但若是对于一整个文件该如何处理呢?
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.
头像
cjxgm
帖子: 1952
注册时间: 2010-04-23 20:40
系统: Arch Linux
来自: 浙江·杭州
联系:

Re: 如何"翻转"文件的0和1

#2

帖子 cjxgm » 2013-04-29 19:10

可以是可以……有意义吗?……
[c]#include <stdio.h>

int main()
{
int ch;
while ((ch = getchar()) != EOF)
putchar(~ch);
return 0;
}
[/c]
[bash]
$ gcc -o revbit revbit.c
$ cat file_a | ./revbit > file_b
[/bash]
Clanjor Prods. | Develop for Developers. (C++, Lua) | 作曲编曲 | 实时渲染引擎
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 如何"翻转"文件的0和1

#3

帖子 eexpress » 2013-04-29 19:35

如果要加密,加密文件头的前128字节就是。xor异或吧,可以带上自己的加密字典。取反蛋疼。
● 鸣学
头像
yjcong
帖子: 2470
注册时间: 2006-02-28 3:11

Re: 如何"翻转"文件的0和1

#4

帖子 yjcong » 2013-04-29 19:43

cjxgm 写了:可以是可以……有意义吗?……
[c]#include <stdio.h>

int main()
{
int ch;
while ((ch = getchar()) != EOF)
putchar(~ch);
return 0;
}
[/c]
[bash]
$ gcc -o revbit revbit.c
$ cat file_a | ./revbit > file_b
[/bash]
谢谢. 当然有意义了, 就是阿姨讲得, 可以加密呀. 若是带上字典或者自定义规则, 比如3*n的翻转,会更好. 或者给加密后的再加密一层

对了, 这个程序可不可以写成./revbit inputfile outputfile 的格式?
上次由 yjcong 在 2013-04-29 19:49,总共编辑 2 次。
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.
头像
yjcong
帖子: 2470
注册时间: 2006-02-28 3:11

Re: 如何"翻转"文件的0和1

#5

帖子 yjcong » 2013-04-29 19:44

eexpress 写了:如果要加密,加密文件头的前128字节就是。xor异或吧,可以带上自己的加密字典。取反蛋疼。
阿姨不愧是阿姨, 直觉够敏锐. 看样子阿姨一定是写过这方面的代码了, 可以分享一下吗?
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 如何"翻转"文件的0和1

#6

帖子 eexpress » 2013-04-29 19:47

dos时代经常搞这事情。没代码。
你改改上面的例子,同时读入源文件和字典文件,直接异或就是。
● 鸣学
头像
yjcong
帖子: 2470
注册时间: 2006-02-28 3:11

Re: 如何"翻转"文件的0和1

#7

帖子 yjcong » 2013-04-29 19:54

eexpress 写了:dos时代经常搞这事情。没代码。
你改改上面的例子,同时读入源文件和字典文件,直接异或就是。
明白了, 再次谢谢阿姨解惑.

对了, 你写的那些代码现在都放哪了?还打算什么时候开始学perl时, 拿来参考一番呢. 记得opera那有一部分, 后来网址找不到了. 然后GitHub上也有一部分, 但不全
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 如何"翻转"文件的0和1

#8

帖子 eexpress » 2013-04-29 19:56

废弃了上百个脚本。剩下的都在github。
● 鸣学
头像
yjcong
帖子: 2470
注册时间: 2006-02-28 3:11

Re: 如何"翻转"文件的0和1

#9

帖子 yjcong » 2013-04-29 20:02

eexpress 写了:废弃了上百个脚本。剩下的都在github。
这样啊. 我也常"废弃"脚本, 但一共也没写够100个.

既然堵到阿姨了, 就再请教一下你对手机/操作系统的看法吧. 估计过几个月, 市面上会有ifone, android, ubuntuFone, jola, firefoxOS.......... 阿姨会选哪个手机搭配那个系统呢?还有啊, 阿姨有没有写过手机用的脚本什么的?
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 如何"翻转"文件的0和1

#10

帖子 eexpress » 2013-04-29 20:10

手机只是一个工具,没写过东西啊。irc的破马是写手机java程序的。你去问吧。
btw: 现在使用移动合约机。root都不想搞了。
● 鸣学
头像
yjcong
帖子: 2470
注册时间: 2006-02-28 3:11

Re: 如何"翻转"文件的0和1

#11

帖子 yjcong » 2013-04-29 20:19

eexpress 写了:手机只是一个工具,没写过东西啊。irc的破马是写手机java程序的。你去问吧。
btw: 现在使用移动合约机。root都不想搞了。
我特别喜欢nokia N9的样子, 结果meego没了. 也不知道jola的样子会是什么. 打算着若是ubuntuFone可以装到nokia上的话, 可以入手个装windows的nokia.

又想起来个一直在疑惑着我的问题, 就是, 若是不需要交互, 只是需要启动, 并在后台运行GUI软件, 那么, linux可以不启动X吗? 比如skype好了, 我设置好自动登录, 而我仅仅是需要让别人看到我在线,而启动后不需要对skype进行任何操作, 那么, 我可以在运行startx之前"虚拟"的运行skype吗?
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.
头像
cjxgm
帖子: 1952
注册时间: 2010-04-23 20:40
系统: Arch Linux
来自: 浙江·杭州
联系:

Re: 如何"翻转"文件的0和1

#12

帖子 cjxgm » 2013-04-29 22:15

就一行的事,干嘛一定要C
[bash]perl -ne 'print~$_' file_in > file_out[/bash]
阿姨把它写得更短些吧
(要是 print 和 $_ 也能省略掉就好了)
Clanjor Prods. | Develop for Developers. (C++, Lua) | 作曲编曲 | 实时渲染引擎
头像
yjcong
帖子: 2470
注册时间: 2006-02-28 3:11

Re: 如何"翻转"文件的0和1

#13

帖子 yjcong » 2013-04-29 22:27

cjxgm 写了:就一行的事,干嘛一定要C
[bash]perl -ne 'print~$_' file_in > file_out[/bash]
阿姨把它写得更短些吧
(要是 print 和 $_ 也能省略掉就好了)
谢谢, 这个够短. 但有2个疑问, 1)在处理大文件上,比如几百M, 几G的数据, 是不是会比C写的慢?2)这个不好加规则或者带字典吧?
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.
头像
cjxgm
帖子: 1952
注册时间: 2010-04-23 20:40
系统: Arch Linux
来自: 浙江·杭州
联系:

Re: 如何"翻转"文件的0和1

#14

帖子 cjxgm » 2013-04-30 14:46

yjcong 写了: 1)在处理大文件上,比如几百M, 几G的数据, 是不是会比C写的慢?
据网上传言,perl速度和C语言差不多,甚至比C语言快(http://raid6.com.au/~onlyjob/posts/arena/)。
我也实测了一下:
[bash]
cjxgm@cjprods /tmp$ ls -lh ti
-rw-r--r-- 1 cjxgm users 35M 4月 30 14:48 ti
cjxgm@cjprods /tmp$ time sh -c "perl -ne 'print~\$_' ti > tout"

real 0m0.522s
user 0m0.353s
sys 0m0.080s
cjxgm@cjprods /tmp$ time sh -c "perl -ne 'print~\$_' ti > tout"

real 0m0.520s
user 0m0.340s
sys 0m0.083s
cjxgm@cjprods /tmp$ time sh -c "./a ti > tout2"

real 0m2.090s
user 0m1.857s
sys 0m0.067s
cjxgm@cjprods /tmp$ time sh -c "./a ti > tout2"

real 0m2.093s
user 0m1.777s
sys 0m0.143s
cjxgm@cjprods /tmp$ diff tout tout2
cjxgm@cjprods /tmp$ # 无输出,证明“置反”的结果正确
cjxgm@cjprods /tmp$ ls -lh
总用量 104M
-rwxr-xr-x 1 cjxgm users 5.2K 4月 30 14:51 a
-rw-r--r-- 1 cjxgm users 201 4月 30 14:51 a.c
drwx------ 2 cjxgm users 80 4月 30 12:20 CRX_75DAF8CB7768
srw------- 1 cjxgm users 0 4月 30 10:56 fcitx-socket-:0
drwxrwxrwt 2 root root 40 4月 30 10:56 systemd-private-AZLCqa
-rw-r--r-- 1 cjxgm users 35M 4月 30 14:48 ti
-rw-r--r-- 1 cjxgm users 35M 4月 30 14:50 tout
-rw-r--r-- 1 cjxgm users 35M 4月 30 14:52 tout2
cjxgm@cjprods /tmp$ cat a.c
#include <stdio.h>

int main(int argc, char * argv[])
{
if (argc != 2) return 1;
freopen(argv[1], "r", stdin);
int ch;
while ((ch = getchar()) != EOF)
putchar(~ch);
fclose(stdin);
return 0;
}
[/bash]
估计perl比C快是优化的缘故。
yjcong 写了:2)这个不好加规则或者带字典吧?
如果你会 perl,可以轻而易举地加规则或者带字典
Clanjor Prods. | Develop for Developers. (C++, Lua) | 作曲编曲 | 实时渲染引擎
头像
yjcong
帖子: 2470
注册时间: 2006-02-28 3:11

Re: 如何"翻转"文件的0和1

#15

帖子 yjcong » 2013-04-30 16:15

cjxgm 写了:
yjcong 写了: 1)在处理大文件上,比如几百M, 几G的数据, 是不是会比C写的慢?
据网上传言,perl速度和C语言差不多,甚至比C语言快(http://raid6.com.au/~onlyjob/posts/arena/)。
我也实测了一下:
[bash]
cjxgm@cjprods /tmp$ ls -lh ti
-rw-r--r-- 1 cjxgm users 35M 4月 30 14:48 ti
cjxgm@cjprods /tmp$ time sh -c "perl -ne 'print~\$_' ti > tout"

real 0m0.522s
user 0m0.353s
sys 0m0.080s
cjxgm@cjprods /tmp$ time sh -c "perl -ne 'print~\$_' ti > tout"

real 0m0.520s
user 0m0.340s
sys 0m0.083s
cjxgm@cjprods /tmp$ time sh -c "./a ti > tout2"

real 0m2.090s
user 0m1.857s
sys 0m0.067s
cjxgm@cjprods /tmp$ time sh -c "./a ti > tout2"

real 0m2.093s
user 0m1.777s
sys 0m0.143s
cjxgm@cjprods /tmp$ diff tout tout2
cjxgm@cjprods /tmp$ # 无输出,证明“置反”的结果正确
cjxgm@cjprods /tmp$ ls -lh
总用量 104M
-rwxr-xr-x 1 cjxgm users 5.2K 4月 30 14:51 a
-rw-r--r-- 1 cjxgm users 201 4月 30 14:51 a.c
drwx------ 2 cjxgm users 80 4月 30 12:20 CRX_75DAF8CB7768
srw------- 1 cjxgm users 0 4月 30 10:56 fcitx-socket-:0
drwxrwxrwt 2 root root 40 4月 30 10:56 systemd-private-AZLCqa
-rw-r--r-- 1 cjxgm users 35M 4月 30 14:48 ti
-rw-r--r-- 1 cjxgm users 35M 4月 30 14:50 tout
-rw-r--r-- 1 cjxgm users 35M 4月 30 14:52 tout2
cjxgm@cjprods /tmp$ cat a.c
#include <stdio.h>

int main(int argc, char * argv[])
{
if (argc != 2) return 1;
freopen(argv[1], "r", stdin);
int ch;
while ((ch = getchar()) != EOF)
putchar(~ch);
fclose(stdin);
return 0;
}
[/bash]
估计perl比C快是优化的缘故。
yjcong 写了:2)这个不好加规则或者带字典吧?
如果你会 perl,可以轻而易举地加规则或者带字典
谢谢, 刚才试了一下几百M的文件, 确实perl比C快了许多, 即便gcc -O2, 看来确实要学学perl了
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.
回复