当前位置: 首页 > 科技观察

没错,我是高端吃瓜达人

时间:2023-03-20 02:04:30 科技观察

前言大家好,我是bigsai大哥,好久不见,很想你们。好吧,让我们步入正轨,已经进入了2022年,2021年,很多人的快乐消遣就是吃瓜了。二手或被动进食者(例如我)。不过现在吃瓜很难了,因为有些瓜可能是假的,在某个博客上查不到,在一些网站和聊天中出现神秘字符串!!这个字符串是什么,惊天大瓜的表情是什么意思,又该如何解读呢?这年头,一点知识都没有的人连吃瓜群众都成不了(手动狗头)!作为程序员,不仅要知道吃瓜的内容,还要知道吃瓜背后的技术!好吧,它不再隐藏了。这个字符串就是著名的摩尔斯电码,也叫摩尔斯电码。当然,这是直接以文字的形式显示出来的。谍战剧、战争剧里那些电报的滴滴其实哒哒大部分都是摩尔斯电码。借此机会深入了解摩尔斯电码!摩尔斯电码是如何发明的?它是由一个叫莫尔斯的天才发明的吗?其实在莫尔斯电码之前,就有一种非常笨重的电报机,但是这个电报机用26根线代表26种字母(肯定没学过电脑,妥妥的暴力审美),实用性很差。在那个电器时代刚刚普及的年代,还没有电话和手机。人们探索的第一步是如何用电来传递信息。在此期间,莫尔斯发明了电报并获得了专利,而他的团队(据说是他的助手阿尔弗雷德·威尔发明了莫尔斯电码)又发明了一套称为莫尔斯电码的传输规则。在当时,用电来传输信息信号是一项伟大的发明,电报的接收者会根据电报的电流控制笔来打印发送者按下的电报内容。电线很短,没有电流通过,纸上的空白就长出来了。然后接收者可以根据摩尔斯电码规则将其翻译成相应的字符词。主要是用点(·)和破(—)的不同排列组合来表示不同的数字或字符,然后点和破之间、字符之间、字母之间的停顿时间都不一样。为什么摩尔斯电码使用点和破折号来表示单词的某些字母?你可以想一下,如果一个符号理论上确实起作用,但是一个符号能表示的内容太少了,一个连续的点代表1,两个连续的点代表2,三个连续的点代表3...n种数字字符需要n个符号来表示,所以符号的使用效率很低。如果用三个符号表示,确实可以表示很多内容,一个长度为5的符号可以表示243个字符。能够表达的内容其实已经远超日常使用(0-9数字,26个字母,几个常用符号)。看起来很紧凑,但是三种符号信号根本不好传递,容易造成混淆问题(比如在电报等其他传递中,很难区分长、中、短,而且要区分多头和空头要困难得多)。所以2是一个非常神奇的数字,无论是在计算机上还是在自然界中都是非常巧妙的。01、长度、速度、高度……可以用两种符号来表示,这些内容在现实生活中也很容易展示和实现的,而且用两种符号来表示内容的多少也是可以接受的.一个长度为5的符号可以表示2^5=32种数字字符,所以这个长度还是可以接受的。摩尔斯电码艺术我们关注摩尔斯电码的一些含义。上面说了,早期摩尔斯团队发明的摩尔斯电码就是一些代表数字的点划线。您可以用一个电子键点击中间的点、划和暂停(长按,短按点(.),破折号(-),松开不按表示暂停),点的持续时间和暂停,字、词等有:点(·):1(读dit,时间占1t)笔画(—):111(读dah,时间占3t)字内停顿(点划之间):0(时间占1t)字间停顿:000(时间占3t)字间停顿:0000000(时间占7t)有了上面的规则,我们大概能知道摩尔斯电码长什么样子,怎么识别它代表什么?这时候就需要查一个码表,才能知道每个字母数字符号对应的内容。部分主要内容如下:SourceWikipedia我靠的,这个好像有点难记,但确实很难。有教授根据这些内容符号的特点,做了摩尔斯电码的二叉搜索树,方便大家记忆摩尔斯电码。以二叉树码为代表的国际摩尔斯电码。图中每个叉子左边的分支是一个点(),右边的分支是一个破折号(-),直到到达需要表示的字符,这样一棵树可以更容易的找到类似的连接内容:来自维基百科不过,摩尔斯电码还是很聪明的(这里不清楚是发明者这么聪明还是记忆大师发现了这么牛逼的法则),摩尔斯电码的字母和数字也有一套象形记忆法,这和我们牛逼的中文有没有几分相似?具体记忆图为:morsecodeofaMorsecodefromdreamstime.com的表示和记忆为:掌握摩尔斯电码。通过上面的介绍,你一定对摩尔斯电码有了一定的了解,对于我们普通人来说,没有必要死记硬背每个字母和数字对应的摩尔斯电码。我们需要掌握的是能够理解摩尔斯电码编解码的方法和规则。简单来说,我们需要掌握发送和接收的规则,将单词的字母转换成摩尔斯电码进行传输,将接收到的摩尔斯电码转换成单词的字母。比如我们现在有:gegiehao,其中a:.-;e:.;g:--.;h:....;i:..;o:---那么它对应于纸上的摩尔斯电码(视觉可识别距离):--..--.....----如果用声音(dida)表示,那就是:--../--../.....----以上大概就是声音传播的过程(/表示一个词停顿的时间比较长),如果用非常精确的二进制表示,0表示没有数据,1表示有数据(按了铃)),其实Da是Di时间的三倍,它的二进制对应是:--../--../.....----1101110100010000000111011101000101000100000001010101000101010100011101110111可能看起来不是很直观,让我优化一下(其实01是连续的没有括号)--../--..../.....------11011101)000(1)0000000(111011101)000(101)000(1)0000000(1010101)000(10111)000(11101110111)dadadidi(大停顿)dadadididiDi(大停顿)di以上是比较标准的摩尔斯电码,其中三个1代表日期(三倍于嘟嘟声的时间),一个1代表嘟嘟声,0代表没有当前数据。还应控制时间表。ticks之间有1t空闲时间,由多个ticks组成的字符之间有3t空闲时间,由多个字符组成的单词之间有7t空闲时间。这样,你几乎可以掌握摩尔斯电码的规则了。同样,如果给你一个摩尔斯电码,参照电码表很容易将其转换成相应的句子。不过在那个时代,很多电报都是按长短收费的,但是很多人都是用一些简单的单词和字母来表示一个句子,所以常用的缩写被很多人使用。这里就不过多介绍了。我知道有点类似于码字,比如plmm:另外,摩尔斯电码还有一些特殊的符号,表示发送错误、停止、终止、出错等。以保证摩尔斯电码传输的正确性(毕竟人脑子糊涂或者手抖的时候肯定是会按错的,对吧?)。对于欧美一些国家来说,那些单词和字母使用标准的摩尔斯电码是没有问题的。毕竟26个字母+数字+10个数字+少量符号就够了。自从摩尔斯电码在1835年发明之后,一直只用来传输英文或拉丁字母。但是在中国乃至其他国家,如何使用电报进行通信呢?拼音?拼音虽然勉强能传递一些信息,但会带来很多问题。误解,例如:taishuaile可能意味着太帅,或太坏。nitaimeile可以说你太漂亮了,也可以说你太漂亮了,也可以说镍钛没了……主要是汉语博大精深,所以拼音不太流畅,所以清朝政府聘请外国人设计中文电报,中文码表以四个阿拉伯数字为码,简称“四码电报”,从四位数字顺序排列0001~9999,用四位数字表示最多10000个汉字、字母和符号。中文电报码,又称标准中文电报码、中文商业电报码、中文电报码或中文电报明码,原是用电报传递中文信息的一种方法。它是第一个将汉字转换为电子信号的码表。你只需要知道它一开始使用的方式。如果想查看相关汉字对应的数字,可以在以下网址查看:https://apps.chasedream.com/chinese-commercial-code/也有相应中文代码的百科全书:https://baike.baidu.com/item/%E4%B8%AD%E6%96%87%E7%94%B5%E7%A0%81/2667759?fr=aladdin但是中文代码不合理还有太多很多代码,所以一般用户是不可能记住和使用的。随着通讯、电话、手机、电脑的发展,汉码的应用场景还比较少。现在各种网站上的中文摩尔斯电码,大部分都不是标准中文码表对应的数字,很多使用的是其他编码——Unicode码。Unicode(统一码、万能码、单一编码)是计算机科学领域的一个行业标准,包括字符集、编码方案等。Unicode为每个字符提供了一个唯一的编号,无论什么平台,无论什么程序,都不管什么语言。所以大部分中文摩尔斯电码实现的时候,都是把对应的汉字转换成4字节的unicode(UCS-4),然后对这四个字符进行摩尔斯编码。当然,各个实施方案的细节还是有差异的,但问题不大,但大多在编码过程中只对中文使用Unicode编码,以保证英文和标准摩尔斯电码的统一。另外,为了使译码过程更简单,中文摩尔斯电码中的每个字符都用\分割,这样通过\就可以准确知道一个字符的起始位置,直接进行相应的转换,这样就不用不必担心字符,处理了数字集中引起的混淆。实现一个简单的中国摩尔斯电码上面说了这么多,对于程序员来说,写出来的代码才是真正的代码,这里针对上面的介绍做一个简单的摩尔斯电码。这里先解释一下实现:标准形式是用`\`作为字符来分割汉字的。这里不使用标准的中文码表。这里使用了4个转换成Unicode编码的十六进制数,中间没有空格,字符之间用斜杠。以bar分隔(放开头),汉字中的Unicode字符之间用空格分隔(本质上属于一个汉字)要将字符转为大写(或小写),编码Unicode时还必须使用一些十六进制的字母编码转换成统一大小写是:importjava.util.HashMap;importjava.util.Locale;importjava.util.Map;//公众号:bigsai//20211.3publicclassMorseCode{MapencMap=newHashMap();//摩尔斯电码表集合MapdecMap=newHashMap();//摩尔斯电码表集合publicstaticvoidmain(String[]args){MorseCodemorseCode=newMorseCode();Stringval="大游戏6好sai66";Stringencode=morseCode.Encryption(val);Stringdecode=morseCode.Decryption(encode);System.out.println(encode);System.out.println(decode);}publicMorseCode(){encMap.put('A',".-");encMap.put('B',"-...");encMap.put('C',"-.-");encMap.put('D',"-..");encMap.put('E',".");encMap.put('F',"..-.");encMap.put('G',"--.");encMap.put('H',"....");encMap.put('I',"..");encMap.put('J',".---");encMap.put('K',"-.-");encMap.put('L',".-..");encMap.put('M',"--");encMap.put('N',"-.");encMap.put('O',"---");encMap.put('P',".--");encMap.put('Q',"--.-");encMap.put('R',".-.");encMap.put('S',"...");encMap.put('T',"-");encMap.put('U',"..-");encMap.put('V',"...-");encMap.put('W',".--");encMap.put('X',"-..-");encMap.put('Y',"-.--");encMap.put('Z',"--..");/*数字电码0-9*/encMap.put('0',"-----");encMap.put('1',".----");encMap.put('2',"..---");encMap.put('3',"...--");encMap.put('4',"....-");encMap.put('5',".....");encMap.put('6',"-....");encMap.put('7',"--...");encMap.put('8',"---..");encMap.put('9',"----.");/*标点符号,可自增删除*/encMap.put(',',"--..--");//,逗号encMap.put('.',".-.-.-");//句点encMap.put('?',"..--..");//?问号encMap.put('!',"-.-.--");//!感叹号encMap.put('\'',".----.");//'单引号encMap.put('\"',".-..-.");//"引用markencMap.put('=',"-...-");//=等号encMap.put(':',"---...");//:冒号encMap.put(';',"-.-.-");//;分号encMap.put('(',"-.--.");//(前括号encMap.put(')',"-.--.-");//)后括号encMap.put('',"");//留个空格,这里的星号是自定义的for(Characterch:encMap.keySet()){decMap.put(encMap.get(ch),ch);}}booleanisChinese(charch){//获取UniCodeBlockCharacter.UnicodeBlockub=Character.UnicodeBlock.of(ch);//GENERAL_PUNCTUATION判断中文“数字”//CJK_SYMBOLS_AND_PUNCTUATION判断中文号//halfwidth_and_fullwidth_forms判断判断的,号if(ub==farne.unicodeblock.cjk_unified_ideographs||ub==ub==ub==ub==contric.cjk_cjk_compolocks||ub==Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION//判断中文的。No.||ub==Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS//判断中文,No.||ub==Character.UnicodeBlock.GENERAL_PUNCTUATION//判断中文"number){returntrue;}returnfalse;}//与中文的转换unicodeStringEncryption(Stringstr){str=str.toUpperCase();//System.out.println(str);StringBuildersBuilder=newStringBuilder();charchs[]=str.toCharArray();for(charch:chs){if(ch==''){//不处理空格continue;}sBuilder.append("\\");//转义字符用斜线分隔if(isChinese(ch)){StringunicodeStr=Integer.toHexString(ch).toUpperCase();//转换为unicoedefor(inti=0;i