Skip to content

关于用纸笔发送mp3的答案

2010年5月2日

前一阵突发奇想,我们已经融入了数码生活,但是数码生活能不能用传统的事物作为载体?于是想到用纸笔怎么传递MP3的问题。

原题是这样的:

一台电脑,一个50k的mp3文件,一支笔,一打纸,一个信封,一张邮票,没有网络,要把这个mp3文件用这些东西无损发给别人,保持md5不变,怎么做?

很多同学给我的答案是直接记录二进制编码,从原理上来讲不错,但是给你一个MP3文件,你能直接给我它的二进制编码么?(如果能,那么高手您就不用往下看了。)

其实是很容易的,但是大家几乎都不这样做,因为没有必要。用个软件——WINHEX即可,搜一下满世界都可以下载。

我们用WINHEX打开一个MP3文件(其实任何文件都可以),左边可以看到类似“AA FF CD 80”之类的,这便是文件的二进制代码的十六进制表示法,也就是说因为二进制占的屏幕空间太大,就换成16进制表示了,每位16进制代码4位二进制代码,每两位十六进制(8位二进制)表示一个字节,比如A是十进制10,二进制表示为1010,AA表示十进制170,二进制为10101010。于是我们用纸把十六进制抄下来,让对方用WINHEX新建一个文件,把十六进制代码打进去,保存为MP3就可以了。

有兴趣的同学试一下在WINHEX中新建文件,大小为40Bytes,左边输入(不要粘贴)

68 74 74 70 73 3A 2F 2F    63 68 75 61 6E 67 71 69
61 6E 67 2E 62 69 7A 2F    77 2E 70 68 70 3F 70 3D
37 35 34 35 37 41 33 41

然后保存为TXT格式。(这是一个翻和谐墙工具的邀请,先看到的先得,拿到了麻烦告诉我一声。)

通过这个示例可以看到这种方法传递文件是可行的。不过我承认我在题目中写的50K对于这样的手工操作确实工作量很大。

WINHEX看到文件的二进制代码还能做很多事情,比如通过头几个字母判断文件类型(如BMP文件开头一定是字符BM对应的十六进制42 4D),比如直接修改文件(如BMP,根据位深,改相应的字节就可以控制某个像素颜色),比如可以比较两个文件异同(如WPS和WORD创建的DOC文件在结构上有很大差异,而WPS创建的WPS和DOC文件结构完全一样)等等。

好了,第一个方法就说到这里,其实我本来是想说第二个方法的。有个小工具叫ANY2BAT,下载地址http://zzzevazzz.bokee.com/5913260.html

这个工具的用法——直接把任何文件拖到图标上,就会生成一个.bat文件,运行.bat文件又会生成原来的文件,所以叫any2bat。那它有什么用呢?它的作用可以概括为“把任何文件变成可打印字符”。不好理解吧?这么说吧,如果某个论坛上不让你上传附件,但是你要跟人共享一个小的图片,怎么办呢?把它用any2bat处理一下,然后用记事本打开bat文件,复制,粘贴就可以了。

回到题目,把MP3拖上去,再把bat文件的内容抄写下来就OK。

其实关于any2bat,重点也不在讲它有多神奇,而在于它用了BASE64编码,这个编码的原理是把3个相连的字节平分成4份,这样每份是6位,因为2^6=64,所以可以选择64个字符来表示每6位的编码,这样3个字节就变成了4个可打印字符。具体的技术细节参见http://baike.baidu.com/view/469071.htm。有了这种编码,任何文本和文件的传输都变得可能了(虽然不一定方便)。事实上BASE64在邮件中用得非常广泛,因为现行的SMTP协议出现比较早,没有考虑到中文编码、附件等等,所以有中文、附件的电子邮件基本上都会用BASE64编码后传输。当然,3变4是会增大体积的。这就是我们经常看到邮件附件体积比真实体积大的原因。

突然觉得我在做科普了,呵呵。

最后,关于数码世界与真实世界,大家做的工作基本都是把真实世界的生活带到数码世界中去,然而,有一位很牛的人物在做的工作却是将数码世界带到现实世界中,而且已经做得非常好了,我当时看完的感觉是:不可思议,太神奇了!

视频演示地址http://www.ted.com/talks/lang/chi_hans/pranav_mistry_the_thrilling_potential_of_sixthsense_technology.html。语言是英语,点一下下面的“SUBTITLES”,选择CHINESE,就可以显示中文字幕。

抒寒居网站写博客功能还在DEMO阶段,尚不能发图,所以没有配图……