xml地图|网站地图|网站标签 [设为首页] [加入收藏]
编程哲学之C,一种将文本编码为图片格式的方法
分类:编程

《代码大全》的第二章:介绍隐喻(类比)的思维方式,
《经济学原理》的第二章:介绍怎么像经济学家一样思考,
《计算机的心智操作系统之哲学原理》的第一章:介绍学习操作系统的思维,
所以我也尽早地介绍我写本系列中会经常运用的学习思维。

世界上的文字可以被四个字节完全覆盖,也就是UTF-32,其他都是变长的格式。而恰好ARGB加起来四个字节,于是完全可以把一个字符映射为一个像素点嘛!

三、查询集合

类比

你知道什么是驱动程序吗,你会怎么向一个小学三年级的学生解释什么是驱动程序呢?

我会跟这个小学生说,现在假设你要准备一个宣传活动,为了这个宣传活动,

  • 你请了一位来自奥地利的音乐家,他能演奏各式各样的音乐,他的名字叫声卡,他是说德语的。
  • 你请了一位来自法国的艺术家,他能画各式各样的画,他的名字叫显卡,他是说法语的。
  • 你请了一位来自意大利的行政,他能收集和准备乐谱和色彩,他的名字叫网卡,他是说意大利语的。
  • 你请了一位来自美国的主管,他能安排任务中的各种细节,他的名字叫操作系统,他是说英语的。

现在为了让声卡,显卡,网卡了解操作系统的安排,你觉得还缺少什么?

这时候是不是有一个答案从你脑海中冒出来,请记住这种感觉。

通过上面的一个例子,你是否已经get到类比的威力

类比(英语:Analogy,源自古希腊语),或类推,是一种认知过程,将某个特定事物所附带的讯息转移到其他特定事物之上。类比通过比较两件事情,清楚揭示二者之间的相似点,并将已知事物的特点,推衍到未知事物中,但两者不一定有实质上的同源性,其类比也不见得“合理”。在记忆、沟通与问题解决等过程中扮演重要角色。

类比是人类思考方式中的一种重要途径,可以用于辨识问题,解释概念,及发现新的事物或功能。

简单来说:类比的学习方法,能让自己一下就想明白了一件事情。

如何更好地应用类比思维

  1. 存取已知的类比来源物概念
  2. 将已知的类比来源物进行和标的物的比对
  3. 评估类比物以及标的物之间配对的吻合度
  4. 存取类比物与标的物之间的推论
  5. 并提取类比物与标的物之间的共通性

并且图片上的字节可以再次加密,非常好玩!我仅演示的超级无敌简单的取反操作。

1.找出List<Product>列表中符合特定条件的所有元素

思维穿越

很多穿越剧讲述穿越到历史某个时间,然后利用自己的现代的知识,闯出一片天地。那么如果现在有机会让你穿越到1983年之前,和比尔盖茨一起打造Windows操作系统,你愿意么?

穿越时空,目前还不可能,但思维可以。思维可以让你设想在1983年之前,你和比尔盖茨一起讨论未来的操作系统应该是怎么样的,具备有那些特性等。

 

C#1.1 查询步骤:循环,if判断,打印

为什么要这样设想呢?

  • 如果你和比尔盖茨一起打造Windows操作系统,你会不了解Windows操作系统么?
  • 如果你阿基米德一起泡澡,你会不熟悉浮力原理么?
  • 如果你和牛顿...

使用思维穿越,能让你参与到每个知识点诞生的过程,这样还有谁比你更加了解它呢?

我自己习惯看方形的图片,于是开平方取整,如果字符数量不足就从字符本身随机取一段,这是为了图片尾部不会几个像素留白,炒鸡不美观,以白色(0xFFFFFFFF)作为终止字符。

product类

那么应该怎么做呢?

当你用电脑在愉快地听着歌写着文档,突然由于文档软件的bug导致电脑死机了,你会提出什么样的解决方案?
当你用电脑在愉快地听着歌写着文档,每当听歌软件切换歌曲的时候,文档软件有几秒卡住不动了,你会提出什么样的解决方案?

这些都是以前操作系统创造者面对过的问题,他们会记得他们遇到什么样的问题——这些记录就可以让你的思维假设你穿越到和操作系统创造者一起打造操作系统,思维可以让你假设和之前操作系统创造者一起讨论,对比你们之间各种提出的解决方案。通过这样的思维假设来让你参与到操作系统设计中,这样还有谁比你更加了解操作系统?

static Bitmap ArgbTextEncode(string input)
        {
            var x = 0;
            var y = 0;
            var lenth = input.Length;
            var yValue = (int)(Math.Sqrt(input.Length) + 1);
            var fill = (yValue * yValue) % (Encoding.Unicode.GetByteCount(input) / 4);
            input += input.Substring(Rnd.random.Next(input.Length - fill - 1), fill);
            var image = new Bitmap(yValue, yValue);

            //fill
            for (int i = 0; i < yValue * yValue; i++)
            {
                if (i == lenth - 1)
                {
                    image.SetPixel(x, y, Color.White);
                }
                else
                {
                    byte[] bytes = Encoding.Unicode.GetBytes(input[i].ToString());
                    var prefix = 4 - bytes.Length;
                    bytes = Enumerable.Repeat<byte>(0, prefix).Concat(bytes).ToArray();
                    Encrypt(bytes);
                    image.SetPixel(x, y, Color.FromArgb(bytes[0], bytes[1], bytes[2], bytes[3]));
                }
                //Console.WriteLine("{0},{1} = {2}", x, y, input[i]);
                x++;
                if (x % yValue == 0)
                {
                    x = 0;
                    y++;
                }
            }
            return image;
        }

图片 1图片 2

神造与人造

如果我们仔细看看身边的事物,就会发现所有的东西可以划分为两类,一类是本来就存在于自然中,人类所做的只不过是发现;另一类是本来并不存在,人类所做的是发明,第一类事物我们称之为神造事物或者自然存在的事物,第二类事物我们称之为人造事物。

自1946年诞生计算机(电脑)后,计算机发展十分迅速,其原因是因为计算机对现实世界的依赖极少,如果你要打造一辆汽车,你必须考虑能量转换啦,地面摩擦啦,空气阻力啦等等等,你必须一一遵守现实世界的种种规则才能让汽车运行起来,但在计算机世界呢,为了让两台计算机通信,我们提出了七层网络模型,但实现起来貌似太过繁琐,所以现在的通信用五层网络模型就好了,其他学科能干这么任性的事情么?(文学,语言这种100%由人创造的也可以,所以编程语言也可以任性,哇咔咔~)

对于现实世界(神造)我们能做的世界基本就是遵守,而对于计算机世界(人造),由于我们是这个世界的神,所以更多的概念和机制是由我们人类提出的。

人造学科的特点 神造学科的特点
不精确,具有相对性 精确、绝对
从对人类活动的观察得出 从对自然存在的观察得出
依赖于人的主观判断力 不依赖于人的主观判断力
通常符合人的直觉 通常违反人的直觉

由于计算机知识和编程语言很多概念,术语,机制都是由人提出的,我们按照人造事物的特点来进行学习,从而易如反掌地掌握该知识点。

当人们面临困境时通常的做法就是:发明新的概念,新的术语或新的机制来解脱困境。——《计算机的心智操作系统之哲学原理》

人们面临困境时的通常做法在电脑世界中(含编程语言)更加发挥的淋漓尽致!为什么羽毛和铁球在同样高度没有空气阻力的情况下同时到达地面,你可能很难get到神的用意(万有引力→引力波→??);但同为人,为什么要这么设定,你只要站在和提出人的视角看看,想想,应该很容易get到。

  

 1 using System.Collections;
 2 using System.ComponentModel;
 3 
 4 namespace Chapter01.CSharp1
 5 {
 6     [Description("Listing 1.01")]
 7     public class Product
 8     {
 9         string name;
10         public string Name
11         {
12             get { return name; }
13         }
14 
15         decimal price;
16         public decimal Price
17         {
18             get { return price; }
19         }
20 
21         public Product(string name, decimal price)
22         {
23             this.name = name;
24             this.price = price;
25         }
26 
27         public static ArrayList GetSampleProducts()
28         {
29             ArrayList list = new ArrayList();
30             list.Add(new Product("West Side Story", 9.99m));
31             list.Add(new Product("Assassins", 14.99m));
32             list.Add(new Product("Frogs", 13.99m));
33             list.Add(new Product("Sweeney Todd", 10.99m));
34             return list;
35         }
36 
37         public override string ToString()
38         {
39             return string.Format("{0}: {1}", name, price);
40         }
41     }
42 }

结束语

本章介绍了使用类比作为切入点让你快速地对某个知识点有个大概的了解,然后再使用感同身受让你参与知识点诞生的过程,从而了解知识的全貌。

下一章将介绍我为什么选择的是C#语言。

最后留下一道思考问题:你自己有什么方式方法来认识这个世界?或者遇到一件你从来没有遇到过的问题,没有人可以给你答案,你会怎么起手去分析它?

找了一个日志文本,看看效果

View Code

扩展阅读

我发布了《编程哲学之C#篇:01——创世纪》后有人留言

把两个完全没有关系的东西,往一块生搬,真不知道易经和二进制有什么关系?易经不是天下最厉害的内功心法吗?出自少林。

我对易经被用于算命,太极八卦图被用于辟邪,如同火药被用于制造烟花爆竹的心情是一样一样的。我以前读书的时候,也不明白为什么古代诗人看不惯世俗然后归园田居,吟诗两首。我们就要:啊,中华文化博大精深。

大部分编程书都会这么写,面向对象的三个基本特征是:封装、继承、多态。而作为被应试教育过来人的我们也会惯性地在封装、继承、多态下面画上横线,然后在考试试卷上妥妥地填上答案,得到分数,完成任务。然而我有幸自学编程,有幸看了《苏菲的世界》,猜想到面向对象思想起源于古希腊三圣的柏拉图、亚理士多德提出,然后我开启了大量的阅读,最后再次得出:啊,中华文化博大精深。

既然古希腊有类比,那么中华文化对类比的描述是:

触类旁通——《周易·系辞上》:“引而伸之;触类而长之;天下之能事毕矣。”

《周易》也叫《易经》为群经之首。我觉得是中华文化的起源和核心。

《易经》讲阴阳协调平衡。

  • 中医:如果你上火了,那么吃一些凉性的食物来平衡。
  • 风水:如果你脾气暴躁(火),那么摆一个鱼缸(水)来平衡。

中华文化很难摆脱平衡的思维。

二进制与《易经》的关系:

莱布尼茨二进制算术体系,在1701以前已经形成,他于1701年初向巴黎皇家学会提交了一篇正式论文,即论述二进制的《数字科学新论》(Essay d'unne nouvelle Science des Nombres),但被婉言谢绝。科学院院长封单内(De Fontenelle)提出的主要理由是看不出二进制有何用处。1703年,在补充了伏羲六十四卦次序图和伏羲六十四卦方位图后,他将全部研究成果发表在法国《皇家科学院院刊》上,[14]标题为“二进制算术阐释——仅仅使用数字0和1兼论其效能及伏羲数字的意义”,莱布尼茨根据二进制来理解先天圆图(先天六十四卦方圆图),说先天原图已经包含了他所发明的东西。

2017年,我买了很多有关中华文化的书,但到现在都没有看,但还是尽可能地补上中华文化对应的知识,希望有一天,你也能再次:啊,中华文化博大精深。

图片 3

ArrayListQuery类

 

图片 4图片 5

 

 1 using System;
 2 using System.Collections;
 3 using System.ComponentModel;
 4 
 5 namespace Chapter01.CSharp1
 6 {
 7     [Description("Listing 1.10")]
 8     class ArrayListQuery
 9     {
10         static void Main()
11         {
12             ArrayList products = Product.GetSampleProducts();
13             foreach (Product product in products)
14             {
15                 if (product.Price > 10m)
16                 {
17                     Console.WriteLine(product);
18                 }
19             }
20         }
21     }
22 }

解码函数

View Code

 

2.测试和打印分开

static string DecodeTextFromArgb(Bitmap image)
        {
            //ComplexImage comp = ComplexImage.FromBitmap(image);
            //comp.BackwardFourierTransform();
            var str = "";
            for (int i = 0; i < image.Height; i++)
            {
                for (int j = 0; j < image.Width; j++)
                {
                    var color = image.GetPixel(j, i);
                    if (color.A == 255 && color.R == 255 && color.G == 255 && color.B == 255)
                        return str;
                    var bytes = new byte[] { color.A, color.R, color.G, color.B };
                    Decrypt(bytes);
                    int skip = 0;
                    if (bytes[0] == 0)
                    {
                        if (bytes[1] == 0)
                        {
                            skip = 2;
                        }
                        else
                        {
                            skip = 1;
                        }
                    }
                    else
                    {
                        skip = 0;
                    }
                    var t = Encoding.Unicode.GetString(bytes.Skip(skip).ToArray());
                    //Console.WriteLine("{0},{1} = {2}", j, i, t);
                    str += t;
                }
            }
            return str;
        }

C#2.0

  

product类

本文由澳门新葡亰手机版发布于编程,转载请注明出处:编程哲学之C,一种将文本编码为图片格式的方法

上一篇:环形缓冲区的实现,嵌入式框架Zorb澳门新葡亰手 下一篇:找出总分最高的学生,字符串和列表
猜你喜欢
热门排行
精彩图文