精华内容
下载资源
问答
  • 科学计算器,超级计算器,高级模拟计算器,电脑计算器 二进制,十进制,十六进制自由切换,自带语音,最大限度减少出错!
  • 此程序供学生学习进制转换。可以更快的算出进制间转换的结果。
  • 1、教学目标通过对二进制数的学习, 使学生掌握计算机中信息表示的方法, 从而对信息的数字化有所认识。 鼓励学生在学习中要善于发现, 善于 钻研,力争为计算机的发展作出自己的贡献。教学内容什么是二进制、十进制...

    《二进制完整版教案》由会员分享,可在线阅读,更多相关《二进制完整版教案(7页珍藏版)》请在人人文库网上搜索。

    1、教学目标通过对二进制数的学习, 使学生掌握计算机中信息表示的方法, 从而对信息的数字化有所认识。 鼓励学生在学习中要善于发现, 善于 钻研,力争为计算机的发展作出自己的贡献。教学内容什么是二进制、十进制为什么计算机要采用二进制表示信息 二进制与十进制之间的转换教学重点与难点为什么计算机要采用二进制表示信息二进制与十进制之间的转换教学方法讲授,练习法教学准备计算机,投影,教案教学过程一、数制(一)数制的概念 师:同学们,大家回想一下,我们最早学习的数字与运算法则是 什么?生:0、1、29 的数字,法则是加法师:对,我们最开始学习的就是十以内的加法,之后是两位数的 加法,在两位数加法的学习中,老师。

    2、是不是经常会说,要注意逢十进 一?也就是我们平常说的别忘了进位。 像这样按进位的原则进行记数 的方法叫做进位记数制。“进位记数制”简称为“数制”或“进制”。 我们平时用的最多的就是十进制了,那么,大家想一下,还有没有其 他的进制呢?比如说,小时、分钟、秒之间是怎么换算的?生:一小时等于60分钟,一分钟等于60秒。师:那我们平时会不会说我做这件事情用了 130分钟呢?我们一 般会说,我花了两个小时零10分钟,也就是说逢六十进一,这就是 60进制。由此也可以推断出, 每一种数制的进位都遵循一个规则, 那就是一一逢N进1。由此可以总结数制的概念就是:数制是用一组固定的数字和一套 统一的规则来表示数目。

    3、的方法。(二)数制特点1、使用一组固定的数字表示数值的大小;如:十进制的表示数字是 0、1、2、3、4、5、6、7、8、9。2、统一的规则:逢N进一;如:十进制逢十进一。(三)数制的要素:基数和位权。这里的N叫做基数。所谓“基数”就是指各种进位计数制中允许选用基本数码的个数,比如,十进制中用09来表示数值,一共 有10个不同的字符,那么,10就是十进制的基数,表示逢十进一。则二进制的基数为二。什么是位权?师:下面我们再引入一个新概念“位权”。大家看一下这个十进制数215215=2*10 2 +1* 10 1 +5*102的数量级为百一102 ; 1的数量级为十一101 ;5的数量级为个一100。

    4、其中102、101、100为权,每一位数字乘以其相应的权就是该位数 的数值。每个数码所表示的数值等于该数码乘以一个与数码所在位置相关的常数,这个常数叫做位权。其大小是以基数为底、数码所在位置 的序号为指数的整数次幕。这就叫做按权相加法。也就是让每一位上的数字字符乘以它所代 表的权。二、为什么计算机都米用二进制表示信息(计算机就其本身来说是一个电器设备,为了能够快速存储、处理、传递信息,其内部采用了大量的电子元件,在这些电子元件中,电路 的通和断、电压高低,这两种状态最容易实现,也最稳定、也最容易 实现对电路本身的控制。我们将计算机所能表示这样的状态,用0,1来表示、即用二进制数表示计算机内部的。

    5、所有运算和操作。二进制数运算非常简单,计算机很容易实现,所以计算机内部都 用二进制编码进行数据的传送和计算。)三、数制转换大家都知道,计算机中采用的是二进制,但用计算机解决实际问 题时对数值的输入输出通常使用十进制, 这就有一个十进制向二进制 转换或由二进制向十进制转换的过程。 也就是说,在使用计算机进行 数据处理时首先必须把输入的十进制数转换成计算机所能接受的二 进制数;计算机在运行结束后,再把二进制数转换为人们所习惯的十 进制数输出。这种将数由一种数制转换成另一种数制称为数制间的转换。下面我们结合实例来讲解一下。1、二进制数转换成十进制数把二进制数转换成十进制数就是用“按权相加法”,把二进。

    6、制数 首先写成加权系数展开式,然后按十进制加法规则求和。例:把二进制数110.11转换成十进制数。(1011.11)2=1*23+1*21+1*20+1*2-1+1*2-2 = 11.752、十进制数转换为二进制数大家看一下前面我们讲的按权相加法中,权的值在小数点左边和 小数点右边是不一样的。所以,十进制数转换为二进制数时,整数和 小数的转换方法也不同,一般我们先把十进制数的整数部分和小数部 分分别转换后,再加以合并。我们先来讲一下转换的方法,再结合实 例来看一下。(1)十进制整数转换为二进制整数十进制整数转换为二进制整数采用除2取余,逆排序法。具体 做法是:用2去除十进制整数,可以得到一个商。

    7、和余数;再用 2去除 商,又会得到一个商和余数,如此进行,直到商为零时为止,然后把 所有余数按逆序排列,也就是把先得到的余数作为二进制数的低位有 效位,后得到的余数作为二进制数的高位有效位,依次排列起来。这 就是所谓“除2取余,逆序排列”。例:将一个十进制数25转换为二进制数。25得到:(25) 10=( 11001)2(2 )十进制小数转换为二进制小数十进制小数转换成二进制小数采用“乘2取整,顺排序”法。具 体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出, 再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出, 如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。 。

    8、然后把取出的整数部分按顺序排列起来, 先取的整数作为二进制小数 的高位有效位,后取的整数作为低位有效位。例:将一个十进制数0.375转换为二进制数。0.3752得到:(0.375)10=(0.011)20.7521.500.5021.0例将一个十进制数35.375转换为二进制数。最后得到转换结果:(35.375) 10=(100011.011) 2大家要好好记住这一点,整数部分是将所得的余数逆序排列,而 小数部分则要将所提出来的积的整数按顺序排列。好了,我们这节课要讲的主要内容就是这些了,下面,我们来就 这些内容做一些练习,看看大家掌握的怎么样了。(3)练习7分钟1、( 1010101.101。

    9、1)2=( )10解:(1010101.1011)2=26+24+22+20+2-1+23+2-4=64+16+4+1+0.5+0.125+0.0625=85.6875 2、(105.625) 10 =(4)、计算机可以帮你转换数制:“开始程序附件计算器查看科学型” 四、课堂小结在中学信息技术学习中, 二进制和数制转换是一个非常基础、 非 常重要的知识点。 希望同学们都能记住计算机中所有的的信息是用二 进制表示的,并且会将二进制和十进制熟练地转换过来。(五)作业 1、将下列数字用按权相加法展开(568.3) io = 5 x 102 + 6 x 101 + 8 X 100 +3X 10-1(101.1) 2 = 1 X 22 + 0 X 21 + 1 X 2 0 + 1 X 2-1 2、二进制数转换成十进制数(101.1) 2 = 1 x22 + 0x21 + 1 x20 + 1 x 2 -1 = (5.5)10十进制转换成二进制数(173.8125) 10=(10101101.1101) 2。

    展开全文
  • 计算器使用VC 6.0 (C++)环境编写,是我院的学科作业,在我加以完善后,已可以支持小数之间的进制转换以及在二进制、八进制、十六进制下的独立运算。此计算器最大的特点在于能在用户输入完整串算式之后再计算。 ...
  • 1、课 题:信息与二进制编码课 时:1课时课 型:新授课教学方法:讲练法教学用具:课件、投影、教学目标:1、知识目标:实施传统的“讲练”法模式,使学生了解信息编码;安全使用计算机的方法。2、能力目标:培养学生...

    《信息与二进制编码》由会员分享,可在线阅读,更多相关《信息与二进制编码(5页珍藏版)》请在人人文库网上搜索。

    1、课 题:信息与二进制编码课 时:1课时课 型:新授课教学方法:讲练法教学用具:课件、投影、教学目标:1、知识目标:实施传统的“讲练”法模式,使学生了解信息编码;安全使用计算机的方法。2、能力目标:培养学生能对二进制做简单计算。教学重点:计算机的安全使用;使用计算机的良好首先的培养。教学难点:二进制的计算。课前准备:1、复习计算机系统的结构图;储存容量的基本计算;2、课件、多媒体教室的试用。教 学 过 程一、复习:(5分钟)师:同学们,通过上节课的学习,我们知道计算机能够正常工作不但需要有硬件部分,还需要软件来支持,否则配置再高的计算机也如同一堆毫无生机的废品。下面请同学思考一下,试着画出计算机。

    2、系统的结构图。(可以请同学在黑板上画。)师:通过大家的演示,再对比一下老师所给的正确结构图。(看大屏演示)(师生共同讨论总结)计算机系统的组成:运算器中央处理器控制器主机随机存储器内存诸器只读存诸器硬件部分输入设备外部设备 输出设备计算机系统 外存储器系统软件软件部分应用软件师:问题二,表示存储器存储容量的基本单位 ,常用的单位之间的换算关系是:1KB= B 1MB= KB 1GB= MB生:回答。二、新课导言:师:大家在日常生活中是否能见到一些只存在两种状态的事或物存在?能否例举出来? 生:例举事物师:能从大家所例举的事物中看出只存在两种状态的事物多存在于电子器件上,这是为什么呢?(由于学生。

    3、为初一年级的学生,知识含量有限,所以由老师做以下简单的解答)电子器件最易形成两种稳定状态,如电压的高低、电流的通断。所以我们在计算机中采用了以0和1两个数字组成的二进制数的形式来表示计算机中所有的信息。(在大屏幕上展示十进制数的运算法则:逢十进一。启发学生说出二进制的运算法则。)二、新课:1、以课件1展示二进制运算法则,与十进制进行转换运算。二进制的重点与难点就是同学们不易改变头脑中的十进制进位方式。2、以课件2展示病毒对计算机的危害。计算机病毒是指可以在计算机系统中起破坏作用的程序。通过课件的展示,使同学们认识到预防计算机病毒的重要性。同时使同学们在使用计算机的过程中,都应该遵循一定的道德标。

    4、准,不应该有违反法律和法规的行为。三、课堂练习:1、把十进制的5、6、8、9转化为二进制的数。2、(11)十=( )二 (15)十=( )二教学后记:第二章 WINDOWS 98操作系统在电脑的实际应用中,电脑的基本操作和操作系统有很大的关系。每种操作系统的命令和使用方法都不完全相同,都有其自身的特点和规律。电脑入门的基本功主要体现在对操作系统的熟练程度,使用操作系统完成电脑操作的能力。Windows 98操作系统是图形方式操作系统,很受人们的欢迎。各个计算机的软件生产厂商也设计了大量在Windows系统环境下运行的软件,使得Windows系统成为PC电脑上流行的操作环境。教学目的:1、认识鼠。

    5、标,学会鼠标的几种操作,认识鼠标指针。 2、了解Windows 98的基本界面,认识各个图标,并学会使用开始菜单。 3、掌握Windows 98的窗口的基本组成与操作能切换各个窗口。 4、能启动Windows 98自带的计算器,并利用计算器进行一些简单的运算。 教学重点: 鼠标的操作、窗口的操作 教学难点:窗口的操作 教学方法:讲解、演示、练习相结合的方法 教学过程:第一节 中文 Win98概述一、Pwin98 的特点Win98是一种不基于 DOS 的一种全新、独立的操作系统,其特点如下:1、全新的用户界面全新图形用户界面。2、支持长文件名可支持长度255个字符且可留空格的文件名。3、完整的操。

    6、作系统一个独立、完整的32位操作系统,不再依赖于DOS。4、即插即用功能 自动检测,自动安装。5、添加和删除程序极为方便:提供了“安装/删除程序”功能,所以安装和卸载软件非常方便。6、强大的网络功能:Win98 不仅是一个PC操作系统,同时也是一个功能强大的网络操作系统,提供了对等网和客户/服务器两种网络模式。7、支持多媒体:自动检测多媒体设备并安装,还提供了多种多媒体软件。8、多任务操作系统:在Win98 环境下,同一时间可运行多个应用程序。二、win98的启动和关闭1、启动 Win98 :从开机到Win98桌面出现的过程。2、关闭Win98 :“开始”“关闭系统 ”选择“关闭计算机”,单击。

    7、“确定”第二节 鼠标的基本操作在Windows 98操作系统下,鼠标一般可以产生下面的几种操作。 (1) 滑动和指向 右按钮鼠标在一个平板上滑动时,会使屏幕上的图形光标和鼠标产生同一方向的移动。图形光标移动的位移量和鼠标移动的位移量不一定成正比。 注意:鼠标不能离开平板进行滑动。滑动鼠标时要靠手腕的灵活性,而不必有很大的动作。 (2)单击 左按钮当图形光标指向甘某个图形标志后,还需要向系统传达操作者的指令。这时只需按一个鼠标按键,就可以使系统接受确认。系统根据图形标志的含义,执行具体的操作。按动一下(按下再松开)鼠标的按键,称为单击。 (3)双击 图形光标指向某个图形标志后,快速、连续按动鼠标按键两次,称为双击。双击需要一定的连续性,但不要求速度极快。 Windows 98操作系统中的双击,一般是指按动鼠标的左键。 (4)拖动 需要移动或多项选择时,会遇到鼠标的拖动动作。图形光标指向某个图形标志时,按住鼠标的按键,滑动鼠标,当达到需要的位置时,松开鼠标的按键,这样就完成了一次拖动。

    展开全文
  • 百易科学计算器是一款适合学生使用的科学计算器。有基本的加减乘除运算功能,还有统计功能。此外,它还具备十六进制、八进制、二进制的计算功能,以及算式解析、曲线拟合、联立方程、概要统计、微积分、复数运算、...
  • 问题1 给你一个值(char,int....),当然他们在内存中都是二进制存在的,怎么反转它们的...二进制和十六进制不熟,直接计算器(囧) 这个数比较小,只是举个例子, 我们直接眼睛瞅可以得出: 0101 1101 0011 0...

    问题1

    给你一个值(char,int....),当然他们在内存中都是二进制存在的,怎么反转它们的值呢?

    int型

    比如  (0x00006CBA)  0000 0000  0000 0000   0110 1100  1011 1010 (27834) 

    二进制和十六进制不熟,直接计算器(囧)

    这个数比较小,只是举个例子, 我们直接用眼睛瞅可以得出:

    0101 1101  0011 0110  0000 0000  0000 0000 => 1563820032 (0x5D360000)

    显然,容易瞅错,要是别人问你,或者你面试,面试官难为你,你这不就笑话了么....还得随带个计算器...

    扯淡哈.....

    这就涉及到一个算法,叫做 分治法 

    https://baike.baidu.com/item/%E5%88%86%E6%B2%BB%E6%B3%95/2407337?fr=aladdin

    我的粗糙理解就是,取最小的问题解决,然后扩大(一般是倍数),直到解决问题,在实现上递归式比较常用的。

    扯远...

    用到这个题上就是,你想倒转,那我从最小组的倒转,自己和自己换没意义,那我就相邻的两个换。各两个互换后,他俩成为一组在和相邻的别的组互换....当只有两组的时候,他俩一换,全部倒腾完了...

    参见一个小伙伴的讲解:

    https://blog.csdn.net/u013074465/article/details/45485959

    当然 出现了这么几个神奇的二进制数

    0x5555555555555555(long) (0101010101010101010101010101010101010101010101010101010101010101)

    太长了,一下用x86int来解说:

    0x55555555 =     (01010101010101010101010101010101) (1431655765)如果你的调试器好你可以看到整数。

    0xAAAAAAAA = (10101010101010101010101010101010)  (2863311530)

    0x33333333  =     (00110011001100110011001100110011) 

    0xCCCCCCCC =(11001100110011001100110011001100)

    0x0f0f0f0f

    0xf0f0f0f0

    0x00ff00ff

    0xff00ff00

    0x0000ffff

    0xffff0000   以下自行二进制............

    看着16进制好怪,无非就是二进制各位不同,就是每一位和其余都不相同意思,由于是二进制,所以一定是10,扩大组就变成

    1100  1111000 .... 依次

    用干啥呢,用来反转的

    num = ((num >> 1) & 0x55555555) | ((num << 1) & 0xAAAAAAAA);

    当参数 v >> 右移1,与(0x05) 0101 相与(留奇),得到 把偶数位放到奇数上,把偶数上位变零

    当参数 v << 左移1,与(0x0A) 1010 相与(留偶),得到 把奇数位放到偶数上,把奇数上位变零

    然后相加(+)或者相或(|),就达到了两位两位反转的目的。

    然后利用递归原理,扩大分组, << 右移2   >>左移 2  , 与 0011(留奇)  1100(留偶)

    << 右移4   >>左移 4  , 与 0001111(留奇)  11110000(留偶)

    至于多大取决于你的字节长度,如果是int,那么 16 就可以了 32 位么,最后一次到移位16 就完成目标啦,

    当然你要是long或者更大,那就看你自己平台了,long 应为 64 位,八个字节,那就在>>32吧。

    所以有一下算法:类C实现(int)

            private static long Number5(uint num)
            {
                num = ((num >> 1) & 0x55555555) | ((num << 1) & 0xaaaaaaaa);
                num = ((num >> 2) & 0x33333333) | ((num << 2) & 0xcccccccc);
                num = ((num >> 4) & 0x0f0f0f0f) | ((num << 4) & 0xf0f0f0f0);
                num = ((num >> 8) & 0x00ff00ff) | ((num << 8) & 0xff00ff00);
                num = ((num >> 16) & 0x0000ffff) | ((num << 16) & 0xffff0000);
                return num;
            }

    神奇有没有,对于不熟悉二进制的上层程序员,不研究一会真不知道他们整的是啥....

     

    问题2

    查出一个int类型数二进制有多少个1。

    我个菜鸟,绞尽脑汁:

     private static int Number(int figure)
     {
          var cout = 0;
          var temp = figure;
          while (temp != 0)
          {
             var c = (temp & 1);
             if (c == 1) cout++;
             temp = temp >> 1;
           }
           return cout;
     }

    然后看见更好的算法...

     private static  int Number(int figture)
            {
                int num = 0;
                while (figture > 0)
                {
                    figture &= (figture - 1);
                    num++;
                }
                return num;
            }

    然后分治法又出来了...

            private static int Number2(int a)
            {
                a = (a & 0x55555555) + ((a >> 1) & 0x55555555);
                a = (a & 0x33333333) + ((a >> 2) & 0x33333333);
                a = (a & 0x0f0f0f0f) + ((a >> 4) & 0x0f0f0f0f);
                a = (a & 0x00ff00ff) + ((a >> 8) & 0x00ff00ff);
                a = (a & 0x0000ffff) + ((a >> 16) & 0x0000ffff);
                return a;
            }

    看看小伙伴的文章:

    https://blog.csdn.net/youdianmengxiangba/article/details/8179832?utm_source=blogxgwz0

    然后这个我也看懂了:

            private static int Number4(long x)
            {
                x -= (x >> 1) & 0x5555555555555555;           
                x = (x & 0x3333333333333333) + ((x >> 2) & 0x3333333333333333);
                x = (x + (x >> 4)) & 0x0f0f0f0f0f0f0f0f;
                x += x >>  8;
                x += x >> 16;
                x += x >> 32;
                return x &0xff;
            }

    然后看不懂了...

    int static  Number5(long x) {
        x -= (x >> 1) & m1;             
        x = (x & m2) + ((x >> 2) & m2); 
        x = (x + (x >> 4)) & m4;        
        return (x * h01)>>56;  //returns left 8 bits of x + (x<<8) + (x<<16) + (x<<24) + ... 
    }

    行吧,程序猿的世界,总是有看不懂代码,先记下来,没事再烧烧脑....

     

     

     

    展开全文
  • C#读写二进制文件 http://www.cnblogs.com/top5/archive/2011/02/07/1949675.html 本文要介绍的C#本地读写二进制文件,二进制文件指保存在物理磁盘的一个文件。 第一步:读写文件转成流对象。其实就是读写...

    C#读写二进制文件

    http://www.cnblogs.com/top5/archive/2011/02/07/1949675.html
    本文要介绍的C#本地读写二进制文件,二进制文件指保存在物理磁盘的一个文件。


    第一步:读写文件转成流对象。其实就是读写文件流 (FileStream对象,在System.IO命名空间中)。File、FileInfo、FileStream这三个类可以将打开文件,并变成文件 流。下面是引用微软对File、FileInfo、FileStream的介绍
    System.IO.File类 提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建 FileStream 对象。
    System.IO.FileInfo类 提供创建、复制、删除、移动和打开文件的实例方法,并且帮助创建 FileStream 对象。无法继承此类。
    System.IO.FileStream类 公开以文件为主的 Stream,既支持同步读写操作,也支持异步读写操作。
    我直接使用 FileStream,他继承于Stream


    第二步:读写流。读写二进制文件用System.IO.BinaryReader和System.IO.BinaryWriter类;读写文本文件用System.IO.TextReader和System.IO.TextWriter类。下面是我的实体 (即要保持到文件的数据)
      /// <summary>
     /// 学生基本信息类
     /// </summary>
     public class Student
     {
      /// <summary>
      /// 学号变量
      /// </summary>
      private String _id;
      /// <summary>
      /// 姓名变量
      /// </summary>
      private String _name;
      /// <summary>
      /// 语文成绩变量
      /// </summary>
      private Double _score1;
      /// <summary>
      /// 数学成绩变量
      /// </summary>
      private Double _score2;
      /// <summary>
      /// 英语成绩变量
      /// </summary>
      private Double _score3;


      /// <summary>
      /// 学号属性
      /// </summary>
      public String Id
      {
       get { return _id; }
       set { _id = value; }
      }
      /// <summary>
      /// 姓名属性
      /// </summary>
      public String Name
      {
       get { return _name; }
       set { _name = value; }
      }
      /// <summary>
      /// 语文成绩属性
      /// </summary>
      public Double Score1
      {
       get { return _score1; }
       set { _score1 = value; }
      }
      /// <summary>
      /// 数学成绩属性
      /// </summary>
      public Double Score2
      {
       get { return _score2; }
       set { _score2 = value; }
      }
      /// <summary>
      /// 英语成绩属性
      /// </summary>
      public Double Score3
      {
       get { return _score3; }
       set { _score3 = value; }
      }
     }
     下面是我的读方法,读取文件中的信息到参数List<Student> stu中  


      /// <summary>
      /// 读取信息方法
      /// </summary>
      /// <returns>读取是否成功</returns>
      public void ReadInfo(List<Student> stu)
      {
       Console.WriteLine("请输入文件读取路径:(键入回车为默认路径)");
       String filename = Console.ReadLine();
       FileStream fs;
       //默认路径
       if (filename == "")
       {
        fs = new FileStream("student.dll", FileMode.Open);
       }
       else
       {
        //如果文件不存在,就提示错误
        if (!File.Exists(filename))
        {
         Console.WriteLine("\n\t读取失败!\n错误原因:可能不存在此文件");
         return;
        }
        //否则创建文件
        fs = new FileStream(filename, FileMode.Open);
       }
       //使用二进制读取
       BinaryReader br = new BinaryReader(fs);
       Console.Write("读取信息将覆盖现有的信息,继续吗?y/n :");
       String command = Console.ReadLine();
       if (command == "y" || command == "Y")
       {
        for (int i = 0; i < stu.Count; i++)
        {
         stu.RemoveAt(i);
        }
        //从磁盘上读取信息
        try
        {
         while (true)
         {
          Student student = new Student();
          student.Id = br.ReadString();
          student.Name = br.ReadString();
          student.Score1 = br.ReadDouble();
          student.Score2 = br.ReadDouble();
          student.Score3 = br.ReadDouble();
          stu.Add(student);
          student = null;
         }
        }
        catch (Exception)
        {
         Console.WriteLine("\n\n读取结束!");
        }
       }
       br.Close();
       fs.Close();
      }

    下面是我的写入方法,写入参数List<Student> stu中的数据

      /// <summary>
      /// 写入信息方法
      /// </summary>
      /// <returns>写入是否成功</returns>
      public void WriteInfo(List<Student> stu)
      {
       Console.WriteLine("请输入文件保存路径:(键入回车为默认路径)");
       FileStream fs;
       String filename = Console.ReadLine();
       //默认路径
       if (filename == "")
       {
        fs = new FileStream("student.dll", FileMode.Create);
       }
       //手动输入路径
       else
       {
        //如果文件存在,就提示错误
        if (File.Exists(filename))
        {
         Console.WriteLine("\n\t保存失败!\n错误原因:可能存在相同文件");
         return;
        }
        //否则创建文件
        fs = new FileStream(filename, FileMode.Create);
       }
       //数据保存到磁盘中
       BinaryWriter bw = new BinaryWriter(fs);
       foreach (Student student in stu)
       {
        bw.Write((String)student.Id);
        bw.Write((String)student.Name);
        bw.Write((Double)student.Score1);
        bw.Write((Double)student.Score2);
        bw.Write((Double)student.Score3);
        bw.Flush();
       }
       bw.Close();
       fs.Close();
       Console.WriteLine("保存成功!");
      }
    ========

    C#二进制文件比较程序

    http://blog.csdn.net/foart/article/details/7031577
    转:http://www.cnblogs.com/hbhbice/archive/2010/06/30/1768477.html


    下面是CompareFile.cs


    [csharp] view plain copy print?
    using System;  
     using System.Collections.Generic;  
     using System.Text;  
     using System.IO;  
     using System.Windows.Forms;  
     using System.Data;  
       
     namespace CompareFile  
     {  
         public  class FileCompare  
         {  
             private FileStream fs1, fs2;  
             private DataTable _DiffTab1,_DiffTab2;  
       
             public DataTable DiffTab1  
             {  
                 get {  
                     return _DiffTab1;  
                 }  
             }  
       
             public DataTable DiffTab2  
             {  
                 get  
                 {  
                     return _DiffTab2;  
                 }  
             }  
       
             public FileCompare(FileStream fs1, FileStream fs2)  
             {  
                 this.fs1 = fs1;  
                 this.fs2 = fs2;  
             }  
       
             public void CompareAllFile()  
             {  
                 if (fs1 .Length !=fs2.Length )  
                 {  
                     if (MessageBox.Show("两文件长度不等\r\n文件1长:" + fs1.Length.ToString() + "\r\n文件2长:" + fs2.Length.ToString() + "\r\n是否继续比较?", "文件比较结果") == DialogResult.Cancel )  
                     {  
                         return;  
                     }  
                 }  
                 BinaryReader br1 = new BinaryReader (fs1 );  
                 BinaryReader br2 = new BinaryReader (fs2);  
                 long min = fs1.Length >= fs2.Length ? fs2.Length : fs1.Length;  
                 for (long i = 0; i <min   ; i++)  
                 {  
                     if ( br1 .ReadByte ()!=br2 .ReadByte ())  
                     {  
                         if (MessageBox.Show("从0起,第" + (br1.BaseStream.Position - 1).ToString() + "个字节不匹配" + "是否继续搜寻?", "文件比较",MessageBoxButtons.OKCancel) == DialogResult.OK)  
                         {  
       
                         }  
                         else   
                         {  
                             br1.BaseStream.Seek((br1.BaseStream.Position / 50) * 50, 0);  
                             br2.BaseStream.Seek((br1.BaseStream.Position / 50) * 50, 0);  
                             if (br1 .BaseStream .Length - br1 .BaseStream .Position >50&&br2 .BaseStream .Length - br2 .BaseStream .Position >50)  
                             {  
                                 _DiffTab1 = new DataTable();  
                                 _DiffTab2 = new DataTable();  
                                 DataColumn dc1 = new DataColumn("位置");  
                                 DataColumn dc2 = new DataColumn("数值");  
                                 DataColumn dc3 = new DataColumn("位置");  
                                 DataColumn dc4 = new DataColumn("数值");  
                                 _DiffTab1.Columns.Add(dc1);  
                                 _DiffTab1.Columns.Add(dc2);  
                                 _DiffTab2.Columns.Add(dc3);  
                                 _DiffTab2.Columns.Add(dc4);  
                                 for (int j = 0; j < 50; j++)  
                                 {  
                                     DataRow dr1 = _DiffTab1.NewRow();  
                                     dr1[0] = br1.BaseStream.Position;  
                                     dr1[1] = br1.ReadByte();  
                                     DiffTab1.Rows.Add(dr1);  
                                     DataRow dr2 = _DiffTab2.NewRow();  
                                     dr2[0] = br2.BaseStream.Position;  
                                     dr2[1] = br2.ReadByte();  
                                     DiffTab2.Rows.Add(dr2);  
                                 }  
                             }  
                             return;                                  
                         }    
       
                     }  
                     if (fs1.Position == min )  
                     {  
                         MessageBox.Show("到达两文件中较小文件的尾部");  
                     }  
                 }                     
       
             }  
         }  
     }  

    Form1.cs
    [csharp] view plain copy print?
    using System;  
    using System.Collections.Generic;  
    using System.ComponentModel;  
    using System.Data;  
    using System.Drawing;  
    using System.Text;  
    using System.Windows.Forms;  
    using System.IO;  
      
    namespace CompareFile  
    {  
        public partial class Form1 : Form  
        {  
            FileStream fs1;  
            FileStream fs2;  
      
            public Form1()  
            {  
                InitializeComponent();  
            }  
      
            private void 打开OToolStripMenuItem_Click(object sender, EventArgs e)  
            {  
                if (openFileDialog1 .ShowDialog ()== DialogResult .OK )  
                {  
                    fs1 = (FileStream )openFileDialog1.OpenFile();  
                }  
            }  
      
            private void 保存SToolStripMenuItem_Click(object sender, EventArgs e)  
            {  
                if (openFileDialog1.ShowDialog ()== DialogResult .OK )  
                {  
                    fs2 = (FileStream )openFileDialog1.OpenFile();  
                }  
            }  
      
            private void 自定义CToolStripMenuItem_Click(object sender, EventArgs e)  
            {  
                if (fs1 != null && fs2 != null)  
                {  
                    CompareFile.FileCompare fc = new CompareFile.FileCompare(fs1, fs2);  
                    fc.CompareAllFile();  
                    dataGridView1.DataSource = fc.DiffTab1;  
                    dataGridView2.DataSource = fc.DiffTab2;  
                }  
                else  
                {  
                    MessageBox.Show ("请先将两个文件打开,然后再进行比较!");  
                }  
      
            }  
      
            private void 另存为AToolStripMenuItem_Click(object sender, EventArgs e)  
            {  
                fs1.Close();  
                fs2.Close();  
      
            }    
        }  
    }  


    Form1.Designer.cs(如果界面方面不清楚,参考以下代码。)


    [csharp] view plain copy print?
    namespace CompareFile  
    {  
        partial class Form1  
        {  
            /// <summary>  
            /// 必需的设计器变量。  
            /// </summary>  
            private System.ComponentModel.IContainer components = null;  
      
            /// <summary>  
            /// 清理所有正在使用的资源。  
            /// </summary>  
            /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>  
            protected override void Dispose(bool disposing)  
            {  
                if (disposing && (components != null))  
                {  
                    components.Dispose();  
                }  
                base.Dispose(disposing);  
            }  
     
            #region Windows 窗体设计器生成的代码  
      
            /// <summary>  
            /// 设计器支持所需的方法 - 不要  
            /// 使用代码编辑器修改此方法的内容。  
            /// </summary>  
            private void InitializeComponent()  
            {  
                System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));  
                this.menuStrip1 = new System.Windows.Forms.MenuStrip();  
                this.文件FToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.新建NToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.打开OToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.保存SToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator();  
                this.另存为AToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();  
                this.打印PToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.打印预览VToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();  
                this.退出XToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.编辑EToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.撤消UToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.重复RToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();  
                this.剪切TToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.复制CToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.粘贴PToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();  
                this.全选AToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.工具TToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.自定义CToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.选项OToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.帮助HToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.内容CToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.索引IToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.搜索SToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();  
                this.关于AToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();  
                this.splitContainer1 = new System.Windows.Forms.SplitContainer();  
                this.dataGridView1 = new System.Windows.Forms.DataGridView();  
                this.dataGridView2 = new System.Windows.Forms.DataGridView();  
                this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();  
                this.toolStrip1 = new System.Windows.Forms.ToolStrip();  
                this.toolStripButton1 = new System.Windows.Forms.ToolStripButton();  
                this.menuStrip1.SuspendLayout();  
                this.splitContainer1.Panel1.SuspendLayout();  
                this.splitContainer1.Panel2.SuspendLayout();  
                this.splitContainer1.SuspendLayout();  
                ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();  
                ((System.ComponentModel.ISupportInitialize)(this.dataGridView2)).BeginInit();  
                this.toolStrip1.SuspendLayout();  
                this.SuspendLayout();  
                //   
                // menuStrip1  
                //   
                this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {  
                this.文件FToolStripMenuItem,  
                this.编辑EToolStripMenuItem,  
                this.工具TToolStripMenuItem,  
                this.帮助HToolStripMenuItem});  
                this.menuStrip1.Location = new System.Drawing.Point(0, 0);  
                this.menuStrip1.Name = "menuStrip1";  
                this.menuStrip1.Size = new System.Drawing.Size(676, 24);  
                this.menuStrip1.TabIndex = 0;  
                this.menuStrip1.Text = "menuStrip1";  
                //   
                // 文件FToolStripMenuItem  
                //   
                this.文件FToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {  
                this.新建NToolStripMenuItem,  
                this.打开OToolStripMenuItem,  
                this.保存SToolStripMenuItem,  
                this.toolStripSeparator,  
                this.另存为AToolStripMenuItem,  
                this.toolStripSeparator1,  
                this.打印PToolStripMenuItem,  
                this.打印预览VToolStripMenuItem,  
                this.toolStripSeparator2,  
                this.退出XToolStripMenuItem});  
                this.文件FToolStripMenuItem.Name = "文件FToolStripMenuItem";  
                this.文件FToolStripMenuItem.Size = new System.Drawing.Size(59, 20);  
                this.文件FToolStripMenuItem.Text = "文件(&F)";  
                //   
                // 新建NToolStripMenuItem  
                //   
                this.新建NToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("新建NToolStripMenuItem.Image")));  
                this.新建NToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta;  
                this.新建NToolStripMenuItem.Name = "新建NToolStripMenuItem";  
                this.新建NToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N)));  
                this.新建NToolStripMenuItem.Size = new System.Drawing.Size(190, 22);  
                this.新建NToolStripMenuItem.Text = "新建(&N)";  
                //   
                // 打开OToolStripMenuItem  
                //   
                this.打开OToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("打开OToolStripMenuItem.Image")));  
                this.打开OToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta;  
                this.打开OToolStripMenuItem.Name = "打开OToolStripMenuItem";  
                this.打开OToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O)));  
                this.打开OToolStripMenuItem.Size = new System.Drawing.Size(190, 22);  
                this.打开OToolStripMenuItem.Text = "打开文件1(&O)";  
                this.打开OToolStripMenuItem.Click += new System.EventHandler(this.打开OToolStripMenuItem_Click);  
                //   
                // 保存SToolStripMenuItem  
                //   
                this.保存SToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta;  
                this.保存SToolStripMenuItem.Name = "保存SToolStripMenuItem";  
                this.保存SToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S)));  
                this.保存SToolStripMenuItem.Size = new System.Drawing.Size(190, 22);  
                this.保存SToolStripMenuItem.Text = "打开文件2(&S)";  
                this.保存SToolStripMenuItem.Click += new System.EventHandler(this.保存SToolStripMenuItem_Click);  
                //   
                // toolStripSeparator  
                //   
                this.toolStripSeparator.Name = "toolStripSeparator";  
                this.toolStripSeparator.Size = new System.Drawing.Size(187, 6);  
                //   
                // 另存为AToolStripMenuItem  
                //   
                this.另存为AToolStripMenuItem.Name = "另存为AToolStripMenuItem";  
                this.另存为AToolStripMenuItem.Size = new System.Drawing.Size(190, 22);  
                this.另存为AToolStripMenuItem.Text = "关闭两文件(&A)";  
                this.另存为AToolStripMenuItem.Click += new System.EventHandler(this.另存为AToolStripMenuItem_Click);  
                //   
                // toolStripSeparator1  
                //   
                this.toolStripSeparator1.Name = "toolStripSeparator1";  
                this.toolStripSeparator1.Size = new System.Drawing.Size(187, 6);  
                //   
                // 打印PToolStripMenuItem  
                //   
                this.打印PToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("打印PToolStripMenuItem.Image")));  
                this.打印PToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta;  
                this.打印PToolStripMenuItem.Name = "打印PToolStripMenuItem";  
                this.打印PToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.P)));  
                this.打印PToolStripMenuItem.Size = new System.Drawing.Size(190, 22);  
                this.打印PToolStripMenuItem.Text = "打印(&P)";  
                //   
                // 打印预览VToolStripMenuItem  
                //   
                this.打印预览VToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("打印预览VToolStripMenuItem.Image")));  
                this.打印预览VToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta;  
                this.打印预览VToolStripMenuItem.Name = "打印预览VToolStripMenuItem";  
                this.打印预览VToolStripMenuItem.Size = new System.Drawing.Size(190, 22);  
                this.打印预览VToolStripMenuItem.Text = "打印预览(&V)";  
                //   
                // toolStripSeparator2  
                //   
                this.toolStripSeparator2.Name = "toolStripSeparator2";  
                this.toolStripSeparator2.Size = new System.Drawing.Size(187, 6);  
                //   
                // 退出XToolStripMenuItem  
                //   
                this.退出XToolStripMenuItem.Name = "退出XToolStripMenuItem";  
                this.退出XToolStripMenuItem.Size = new System.Drawing.Size(190, 22);  
                this.退出XToolStripMenuItem.Text = "退出(&X)";  
                //   
                // 编辑EToolStripMenuItem  
                //   
                this.编辑EToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {  
                this.撤消UToolStripMenuItem,  
                this.重复RToolStripMenuItem,  
                this.toolStripSeparator3,  
                this.剪切TToolStripMenuItem,  
                this.复制CToolStripMenuItem,  
                this.粘贴PToolStripMenuItem,  
                this.toolStripSeparator4,  
                this.全选AToolStripMenuItem});  
                this.编辑EToolStripMenuItem.Name = "编辑EToolStripMenuItem";  
                this.编辑EToolStripMenuItem.Size = new System.Drawing.Size(60, 20);  
                this.编辑EToolStripMenuItem.Text = "编辑(&E)";  
                //   
                // 撤消UToolStripMenuItem  
                //   
                this.撤消UToolStripMenuItem.Name = "撤消UToolStripMenuItem";  
                this.撤消UToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Z)));  
                this.撤消UToolStripMenuItem.Size = new System.Drawing.Size(156, 22);  
                this.撤消UToolStripMenuItem.Text = "撤消(&U)";  
                //   
                // 重复RToolStripMenuItem  
                //   
                this.重复RToolStripMenuItem.Name = "重复RToolStripMenuItem";  
                this.重复RToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Y)));  
                this.重复RToolStripMenuItem.Size = new System.Drawing.Size(156, 22);  
                this.重复RToolStripMenuItem.Text = "重复(&R)";  
                //   
                // toolStripSeparator3  
                //   
                this.toolStripSeparator3.Name = "toolStripSeparator3";  
                this.toolStripSeparator3.Size = new System.Drawing.Size(153, 6);  
                //   
                // 剪切TToolStripMenuItem  
                //   
                this.剪切TToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("剪切TToolStripMenuItem.Image")));  
                this.剪切TToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta;  
                this.剪切TToolStripMenuItem.Name = "剪切TToolStripMenuItem";  
                this.剪切TToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.X)));  
                this.剪切TToolStripMenuItem.Size = new System.Drawing.Size(156, 22);  
                this.剪切TToolStripMenuItem.Text = "剪切(&T)";  
                //   
                // 复制CToolStripMenuItem  
                //   
                this.复制CToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("复制CToolStripMenuItem.Image")));  
                this.复制CToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta;  
                this.复制CToolStripMenuItem.Name = "复制CToolStripMenuItem";  
                this.复制CToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C)));  
                this.复制CToolStripMenuItem.Size = new System.Drawing.Size(156, 22);  
                this.复制CToolStripMenuItem.Text = "复制(&C)";  
                //   
                // 粘贴PToolStripMenuItem  
                //   
                this.粘贴PToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("粘贴PToolStripMenuItem.Image")));  
                this.粘贴PToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta;  
                this.粘贴PToolStripMenuItem.Name = "粘贴PToolStripMenuItem";  
                this.粘贴PToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.V)));  
                this.粘贴PToolStripMenuItem.Size = new System.Drawing.Size(156, 22);  
                this.粘贴PToolStripMenuItem.Text = "粘贴(&P)";  
                //   
                // toolStripSeparator4  
                //   
                this.toolStripSeparator4.Name = "toolStripSeparator4";  
                this.toolStripSeparator4.Size = new System.Drawing.Size(153, 6);  
                //   
                // 全选AToolStripMenuItem  
                //   
                this.全选AToolStripMenuItem.Name = "全选AToolStripMenuItem";  
                this.全选AToolStripMenuItem.Size = new System.Drawing.Size(156, 22);  
                this.全选AToolStripMenuItem.Text = "全选(&A)";  
                //   
                // 工具TToolStripMenuItem  
                //   
                this.工具TToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {  
                this.自定义CToolStripMenuItem,  
                this.选项OToolStripMenuItem});  
                this.工具TToolStripMenuItem.Name = "工具TToolStripMenuItem";  
                this.工具TToolStripMenuItem.Size = new System.Drawing.Size(61, 20);  
                this.工具TToolStripMenuItem.Text = "工具(&T)";  
                //   
                // 自定义CToolStripMenuItem  
                //   
                this.自定义CToolStripMenuItem.Name = "自定义CToolStripMenuItem";  
                this.自定义CToolStripMenuItem.Size = new System.Drawing.Size(117, 22);  
                this.自定义CToolStripMenuItem.Text = "比较(&C)";  
                this.自定义CToolStripMenuItem.Click += new System.EventHandler(this.自定义CToolStripMenuItem_Click);  
                //   
                // 选项OToolStripMenuItem  
                //   
                this.选项OToolStripMenuItem.Name = "选项OToolStripMenuItem";  
                this.选项OToolStripMenuItem.Size = new System.Drawing.Size(117, 22);  
                this.选项OToolStripMenuItem.Text = "选项(&O)";  
                //   
                // 帮助HToolStripMenuItem  
                //   
                this.帮助HToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {  
                this.内容CToolStripMenuItem,  
                this.索引IToolStripMenuItem,  
                this.搜索SToolStripMenuItem,  
                this.toolStripSeparator5,  
                this.关于AToolStripMenuItem});  
                this.帮助HToolStripMenuItem.Name = "帮助HToolStripMenuItem";  
                this.帮助HToolStripMenuItem.Size = new System.Drawing.Size(61, 20);  
                this.帮助HToolStripMenuItem.Text = "帮助(&H)";  
                //   
                // 内容CToolStripMenuItem  
                //   
                this.内容CToolStripMenuItem.Name = "内容CToolStripMenuItem";  
                this.内容CToolStripMenuItem.Size = new System.Drawing.Size(128, 22);  
                this.内容CToolStripMenuItem.Text = "内容(&C)";  
                //   
                // 索引IToolStripMenuItem  
                //   
                this.索引IToolStripMenuItem.Name = "索引IToolStripMenuItem";  
                this.索引IToolStripMenuItem.Size = new System.Drawing.Size(128, 22);  
                this.索引IToolStripMenuItem.Text = "索引(&I)";  
                //   
                // 搜索SToolStripMenuItem  
                //   
                this.搜索SToolStripMenuItem.Name = "搜索SToolStripMenuItem";  
                this.搜索SToolStripMenuItem.Size = new System.Drawing.Size(128, 22);  
                this.搜索SToolStripMenuItem.Text = "搜索(&S)";  
                //   
                // toolStripSeparator5  
                //   
                this.toolStripSeparator5.Name = "toolStripSeparator5";  
                this.toolStripSeparator5.Size = new System.Drawing.Size(125, 6);  
                //   
                // 关于AToolStripMenuItem  
                //   
                this.关于AToolStripMenuItem.Name = "关于AToolStripMenuItem";  
                this.关于AToolStripMenuItem.Size = new System.Drawing.Size(128, 22);  
                this.关于AToolStripMenuItem.Text = "关于(&A)...";  
                //   
                // splitContainer1  
                //   
                this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;  
                this.splitContainer1.Location = new System.Drawing.Point(0, 24);  
                this.splitContainer1.Name = "splitContainer1";  
                //   
                // splitContainer1.Panel1  
                //   
                this.splitContainer1.Panel1.Controls.Add(this.dataGridView1);  
                //   
                // splitContainer1.Panel2  
                //   
                this.splitContainer1.Panel2.Controls.Add(this.dataGridView2);  
                this.splitContainer1.Size = new System.Drawing.Size(676, 528);  
                this.splitContainer1.SplitterDistance = 326;  
                this.splitContainer1.TabIndex = 1;  
                //   
                // dataGridView1  
                //   
                this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;  
                this.dataGridView1.Location = new System.Drawing.Point(0, 28);  
                this.dataGridView1.Name = "dataGridView1";  
                this.dataGridView1.RowTemplate.Height = 23;  
                this.dataGridView1.Size = new System.Drawing.Size(326, 500);  
                this.dataGridView1.TabIndex = 0;  
                //   
                // dataGridView2  
                //   
                this.dataGridView2.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;  
                this.dataGridView2.Location = new System.Drawing.Point(0, 28);  
                this.dataGridView2.Name = "dataGridView2";  
                this.dataGridView2.RowTemplate.Height = 23;  
                this.dataGridView2.Size = new System.Drawing.Size(346, 500);  
                this.dataGridView2.TabIndex = 0;  
                //   
                // openFileDialog1  
                //   
                this.openFileDialog1.FileName = "openFileDialog1";  
                //   
                // toolStrip1  
                //   
                this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {  
                this.toolStripButton1});  
                this.toolStrip1.Location = new System.Drawing.Point(0, 24);  
                this.toolStrip1.Name = "toolStrip1";  
                this.toolStrip1.Size = new System.Drawing.Size(676, 25);  
                this.toolStrip1.TabIndex = 2;  
                this.toolStrip1.Text = "toolStrip1";  
                //   
                // toolStripButton1  
                //   
                this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;  
                this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image")));  
                this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta;  
                this.toolStripButton1.Name = "toolStripButton1";  
                this.toolStripButton1.Size = new System.Drawing.Size(23, 22);  
                this.toolStripButton1.Text = "toolStripButton1";  
                //   
                // Form1  
                //   
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);  
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;  
                this.ClientSize = new System.Drawing.Size(676, 552);  
                this.Controls.Add(this.toolStrip1);  
                this.Controls.Add(this.splitContainer1);  
                this.Controls.Add(this.menuStrip1);  
                this.MainMenuStrip = this.menuStrip1;  
                this.Name = "Form1";  
                this.Text = "Form1";  
                this.menuStrip1.ResumeLayout(false);  
                this.menuStrip1.PerformLayout();  
                this.splitContainer1.Panel1.ResumeLayout(false);  
                this.splitContainer1.Panel2.ResumeLayout(false);  
                this.splitContainer1.ResumeLayout(false);  
                ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();  
                ((System.ComponentModel.ISupportInitialize)(this.dataGridView2)).EndInit();  
                this.toolStrip1.ResumeLayout(false);  
                this.toolStrip1.PerformLayout();  
                this.ResumeLayout(false);  
                this.PerformLayout();  
      
            }  
     
            #endregion  
      
            private System.Windows.Forms.MenuStrip menuStrip1;  
            private System.Windows.Forms.ToolStripMenuItem 文件FToolStripMenuItem;  
            private System.Windows.Forms.ToolStripMenuItem 新建NToolStripMenuItem;  
            private System.Windows.Forms.ToolStripMenuItem 打开OToolStripMenuItem;  
            private System.Windows.Forms.ToolStripSeparator toolStripSeparator;  
            private System.Windows.Forms.ToolStripMenuItem 保存SToolStripMenuItem;  
            private System.Windows.Forms.ToolStripMenuItem 另存为AToolStripMenuItem;  
            private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;  
            private System.Windows.Forms.ToolStripMenuItem 打印PToolStripMenuItem;  
            private System.Windows.Forms.ToolStripMenuItem 打印预览VToolStripMenuItem;  
            private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;  
            private System.Windows.Forms.ToolStripMenuItem 退出XToolStripMenuItem;  
            private System.Windows.Forms.ToolStripMenuItem 编辑EToolStripMenuItem;  
            private System.Windows.Forms.ToolStripMenuItem 撤消UToolStripMenuItem;  
            private System.Windows.Forms.ToolStripMenuItem 重复RToolStripMenuItem;  
            private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;  
            private System.Windows.Forms.ToolStripMenuItem 剪切TToolStripMenuItem;  
            private System.Windows.Forms.ToolStripMenuItem 复制CToolStripMenuItem;  
            private System.Windows.Forms.ToolStripMenuItem 粘贴PToolStripMenuItem;  
            private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;  
            private System.Windows.Forms.ToolStripMenuItem 全选AToolStripMenuItem;  
            private System.Windows.Forms.ToolStripMenuItem 工具TToolStripMenuItem;  
            private System.Windows.Forms.ToolStripMenuItem 自定义CToolStripMenuItem;  
            private System.Windows.Forms.ToolStripMenuItem 选项OToolStripMenuItem;  
            private System.Windows.Forms.ToolStripMenuItem 帮助HToolStripMenuItem;  
            private System.Windows.Forms.ToolStripMenuItem 内容CToolStripMenuItem;  
            private System.Windows.Forms.ToolStripMenuItem 索引IToolStripMenuItem;  
            private System.Windows.Forms.ToolStripMenuItem 搜索SToolStripMenuItem;  
            private System.Windows.Forms.ToolStripSeparator toolStripSeparator5;  
            private System.Windows.Forms.ToolStripMenuItem 关于AToolStripMenuItem;  
            private System.Windows.Forms.SplitContainer splitContainer1;  
            private System.Windows.Forms.OpenFileDialog openFileDialog1;  
            private System.Windows.Forms.DataGridView dataGridView1;  
            private System.Windows.Forms.DataGridView dataGridView2;  
            private System.Windows.Forms.ToolStrip toolStrip1;  
            private System.Windows.Forms.ToolStripButton toolStripButton1;    
        }  
    }  
    ========

    C# Parsing 类实现的 PDF 文件分析器

    https://www.oschina.net/translate/pdf-file-analyzer-with-csharp-parsing-classes-vers


    下载示例
    下载源代码


    1. 介绍


    这个项目让你可以去读取并解析一个PDF文件,并将其内部结构展示出来. PDF文件的格式标准文档可以从Adobe那儿获取到. 这个项目基于“PDF指南,第六版,Adobe便携文档格式1.7 2006年11月”. 它是一个恐怕有1310页的大部头. 本文提供了对这份文档的简洁概述. 与此相关的项目定义了用来读取和解析PDF文件的C#类. 为了测试这些类,附带的测试程序PdfFileAnalyzer让你可以去读取一个PDF文件,分析它并展示和保存结果. 程序将PDF文件分割成单独每页的描述,字体,图片和其它对象. 有两种类型的PDF文件不受此程序的支持: 加密文件和多代文件.


    这个程序的1.1版本允许世界各地使用点符号作为小数分隔符的程序员来编译和运行程序.


    1.2版本则修复了一个有关使用跨多个引用流来读取PDF文档的问题. 1.2之前的版本对此场景只会以一个对象数字重复的错误而终止运行.


    如果你对将PDF文件写入器引入你的应用程序,那就请读一读 "PDF 文件写入程序 C# 类库" 这篇文章吧.


    PDF格式的文件,借助Adobe Acrobat软件,可以在各种屏幕上显示查看,使用各种打印机打印。但是,如果使用二进制文件编辑器打开PDF文件,你会发现文件的大部分是不可读的,有小部分是可读的,如下:


    1 0 obj
    <</Lang(en-CA)/MarkInfo<</Marked true>>/Pages 2 0 R
    /StructTreeRoot 10 0 R/Type/Catalog>>
    endobj
    2 0 obj
    <</Count 1/Kids[4 0 R]/Type/Pages>>
    endobj 
    4 0 obj
    <</Contents 5 0 R/Group <</CS/DeviceRGB /S/Transparency /Type/Group>>
    /MediaBox[0 0 612 792] /Parent 2 0 R
    /Resources <</Font <</F1 6 0 R /F2 8 0 R>>
    /ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>
    /StructParents 0/Tabs/S/Type/Page>>
    endobj
    5 0 obj
    <</Filter/FlateDecode/Length 2319>>
    stream
    . . .
    endstream
    endobj
    看上去,该文件是由嵌套在“n 0 OBJ ”和“ endobj ”关键词之间的对象组成的,术语PDF也就是间接对象的意思。 “obj”前面的数字是对象编号和第几代对象标识, 双尖括号中的内容表示数据字典对象,中括号中的内容表示数组对象, 以斜杠/ 开始的内容表示参数名称 (例如: /Pages)。上例中的第一项 “1 0 obj” 表示文档的目录或者文档的根对象。文档目录的字典对象 “/Pages 2 0 R”,指向定义页码树对象的引用。按照这样推算,编号为2的对象包含指向 “/Kids[4 0 R]”的页面的引用,是一个页面文档。 编号为4的对象是唯一的一个页面定义, 页面大小为612*792点, 换句话说,也就是8.5” * 11” (1” 代表72 点)点。该页面使用了两种字体F1和F2,这两种字体分别在编号为6和8的对象中定义。该页面的内容在编号为5的对象中描述,该对象中包含页面绘图的流信息,示例中的 “. . .”代表这部分流信息。如果使用二进制文件编辑器打开PDF文件,会发现这部分流信息看起来是一长串不可读的随机数,原因是那是压缩数据。流数据采用Zlib方法压缩,压缩方式由字典对象“/Filter /FlateDecode”描述,被压缩流的大小为2319字节。解压这部分流信息,前面几行内容如下所示:


    q
    37.08 56.424 537.84 679.18 re
    W* n
    /P <</MCID 0>> BDC 0.753 g
    36.6 465.43 537.96 24.84 re
    f*
    EMC  /P <</MCID 1/Lang (x-none)>> BDC BT
    /F1 18 Tf
    1 0 0 1 39.6 718.8 Tm
    0 g
    0 G
    [(GRA)29(NOTECH LI)-3(MIT)-4(ED)] TJ
    ET
    这是页面描述语言的一个小例子。 示例中, “re” 代表矩形,“re” 前面的4个数字代表矩形的位置和大小,依次为:起点横坐标、起点纵坐标、宽度、高度。


    这个简单的例子演示了PDF文件内部实现的总体思路。从页面层次结构的根对象开始, 每一页都定义了诸如字体、图片、内容流的资源,内容流由操作符和绘制页面所需要的参数构成。PDF文件分析器会产生一个对象汇总文件,该文件包含非流对象的其他所有对象。每个数据流会被解码并保存为一个单独的文件, 页面描述流保存为文本格式的文件, 图片流保存为.jpg或.bmp格式的文件,字体流保存为.ttf格式的文件,其他二进制流保存为.bin 格式的文件,文本流保存为.txt格式的文件。通过另一个解析过程,晦涩难懂的页面描述会被转换为伪C#代码,如上例中的页面描述被转为:


    SaveGraphicsState(); // q
    Rectangle(37.08, 56.424, 537.84, 679.18); // re
    ClippingPathEvenOddRule(); // W*
    NoPaint(); // n
    BeginMarkedContentPropList("/P", "<</MCID 0>>"); // BDC
    GrayLevelForNonStroking(0.753); // g
    Rectangle(36.6, 465.43, 537.96, 24.84); // re
    FillEvenOddRule(); // f*
    EndMarkedContent(); // EMC
    BeginMarkedContentPropList("/P", "<</Lang(x-none)/MCID 1>>"); // BDC
    BeginText(); // BT
    SelectFontAndSize("/F1", 18); // Tf
    TextMatrix(1, 0, 0, 1, 39.6, 718.8); // Tm
    GrayLevelForNonStroking(0); // g
    GrayLevelForStroking(0); // G
    ShowTextWithGlyphPos("[(GRA)29(NOTECH LI)-3(MIT)-4(ED)]"); // TJ
    EndTextObject(); // ET
    文章接下来的部分将对PDF文件的结构和解析过程进行更为详细的描述,接下来的章节包括:对象定义,文件结构,文件解析,文件读取,以及使用PDF文件分析器编程。


    3. 免责声明


    pdf 文件分析器能处理大量的文件,这是我在自己的系统上扫描众多PDF文件的经验。不过,该程序不支持加密文件或者多个代文件(在对象不为零之前的第二个数字)。在PDF规格文件之中可用功能的数量是非常显著的。这并不可能为一个单的个开发者系统地测试所有的功能。如果在整个文件分析期间该程序抛出一个异常,将显示一条错误信息,该信息显示源代码模块名和行号。


    4.对象定义


    PDF文件生成多个对象。在PDF文件分析器项目中每个PDF对象都有一个对应的类。所有这些对象类都派生于PDFbase类。对象类定义源代码是BasicObjects.cs.确却地PDF对象定义在Adobe pdf文件 规格第三章之中是有用的


    Boolean对象是靠PdfBoolean类来实现的. Boolean在PDF上的定义同C#上的是相同的.


    Integer 对象是靠PdfInt类来实现的. PDF上的定义同C#上Int32的定义是相同的.


    实数对象是靠PdfReal类来实现的. PDF上的定义同C#上的Single定义相同.


    String 对象是靠PdfStr类来实现的. PDF上的定义同C#相比有所不同. String 是用字节构造出来的,而不是字符. 它被包在圆括号()里面. PdfFileAnalyzer会把包含在圆括号中的C#字符串保存成PDF的字符串. PDF的字符串对于ASCII编码非常有用.


    十六进制字符串独享是靠PdfHex类来实现的. 它是由每字节两个十六进制数定义,并包在尖括号里面的字符串. PdfFileAnalyzer 将包含在尖括号中的C#字符串保存成PDF十六进制字符串. 对于 PDF 读取器,字符串和十六进制字符串对象可用于同种目的. 字符串 (AB) 等同于<4142>. PDF 十六进制字符串对于任意编码的场景非常有用.


    Name 对象是靠PdfName类来实现的. Name 对象是由打头的正斜杠后面跟着一些字符组成的. 例如 /Width. Named 对象用作参数名称. PdfFileAnalyzer 将正斜杠开头的C#字符串保存成Name对象.


    Null 对象是靠PdfNull类来实现的. PDF 对于null的定义基本上同C#中的是一样的.


    4.2. 复合的对象


    Array 对象是靠 PdfArray 类来实现的. PDF 数组是一个封装在一堆中括号中的对象的集合. 一个数组的对象可以是除了流之外的任何对象.PdfFileAnalyzer 将一个C#数组中的对象保存成PdfBase类


    . 因为所有的对象都继承自PdfBase,所有在这个数组中保存多种类型的对象没有啥问题. 当数组对象被转换成一个字符串时(使用ToString()方法), 程序会在首位添加中括号. 数组可以是空的. 下面是一个有六个对象的数组示例: [120 9.56 true null (string) <414243>].


    Dictionary 对象是靠PdfDict类实现的. PDF 字典是一组被包入一对双尖括号中的键值对集合. Dictionary 的键是一个对象的名称,而值则可以是除了流之外的任何对象.  PdfFileAnalyzer 将一个键值对保存到PdfPair类中. 键是一个C#字符串,而值则是一个PdfBase.PdfDict 类有一个PdfPair类的数组. Dictionary 可以用键来访问. 因而键值对的顺序没有啥意义. PdfFileAnalyzer 用键来对键值对进行排序. 下面是一个有三个键值对的字典: <</CropBox [0 0 612 792] /Rotate 0 /Type /Page>>.


    Stream 对象是靠PdfStream来实现的. Streams 被用来处理面熟语言,图形和字体. PDF Stream 由一个字典和一个字节流组成. 字典中定义了流的参数. 比如流对象中字典的一个键值对 /Filter. PDF 文档定义了10种类型的过滤器. PdfFileAnalyzer 支持了4种. 这是我发现在实际场景中只会被用到那4种. 压缩过滤器 FlateDecode 是现在的PDF写入器最长被用到的过滤器. FlateDecode支持ZLib解压缩. LZWDecode 压缩过滤器在过去些年用的比较多. 为了能读取比较老的PDF文件, 我们的程序支持这个过滤器. ASCII85Decode 过滤器将可被打印的ASCII转换成二进制位. DCTDecode 用于JPEG图像的压缩.PdfFileAnalyzer 为前三种实现了解压缩. DCTDecode 流则以文件扩展名.jpg保存. 它是一个可以被展示的图片文件.


    Object 流在PDF 1.5中被引入. 它是一个包含多个间接对象(在下面会描述道)的流. 上面描述的Stream 对象一次只压缩一个流. Object 流会将所有包含进来的流压缩到一个压缩域中.


    多引用流在PDF 1.5中被引入. 它是一个包含多引用表格的流,下文会描述到.


    内联图片对象是靠 PdfInlineImage来实现的. 它是一个带有一个流的流. 内联图片是页面描述语言的一部分. 它由BI-开头图形, ID-图形数据和EI-结尾图形这三个操作符组成. BI 和 ID 之间的区域是一个图形字典,而ID 和 EI 之间的区域则包含图形数据.


    4.3. 间接对象


    间接对象是靠 PdfIndirectObject实现的. 它是一个PDF文档的主要构造块. 间接对象是任何被包在 “n 0 obj” 和 “endobj”之间的对象. 其它对象可以通过设定“n 0 R”来引用间接对象. “n”代表对象编号. “0”代表生成编号. 这个程序不支持0之外的生成编号. PDF 规范允许其它的编号. 多代生成的理念允许PDF的修改操作是在保留原有文件的基础上追加变更.


    对象引用时一种引用间接对象的方法. 例如 /Pages 2 0 R 是目录对象中的字典里的一项. 它是一个指向 /Pages 对象的指针. pages对象是编号为2的间接对象.


    4.4. 操作符和关键词


    操作符和关键词不被认为是PDF对象. 而PdfFileAnalyzer 程序有一个PdfOp 和一个PdfKeyword 类可以从中得到 PdfBase 的类. 在转换过程中,转换器为每一个可用的字符序列创建了一个 PdfOp 或者PdfKeyword . Pdf文件规范的附录A-操作符总结中列出了所有的操作符. 列表中有73个操作符. 下面是一些操作符的示例: BT-打头的文本对象, G-用于做记号的设置灰度操作, m-移动到, re-矩形和Tc-设置字符间距. 下面是关键词的示例: stream, obj, endobj, xref.


    5. 文件结构


    PDF文件由四个部分构成: 头部Header , 主体body, 多引用cross-reference 和附带签名 trailer signature.


    Header: 头部是文件的签名. 它必须是 %PDF-1.x , x 从 0 到 7.


    Body: 主体区域包含所有的间接对象.


    Cross-reference: 多引用是一个指向所有间接对象的文件位置指针列表. 有两种类型的多引用表格. 原始的类型有ASCII字符组成. 新式的是一个包含一个间接对象的流. 信息以二进制数字编码. 在多引用表格的结束部分有一个附件字典. 一个文件可以有超过一个的多引用区域.


    Trailer signature: 附带签名由关键词“startxref”, 最后一个多引用表格的偏移位, 和结束签名 %%EOF 组成. 请注意: 附带签名是多引用区域的一部分.


    6. 文件转换


    PDF 文件是一个字节的序列. 一些字节有特殊的意义.


    空格被定义成: null, tab, 换行, 换页, 回车和间隔.


    分隔符被定义成: (, ), <, >, [, ], {, }, /, %, 以及空格字符.


    文件转换是由PdfParser 类来完成的. 开始进行转换过程是,程序会设置文件需要被转换区域的位置. ParseNextItem() 是提取下一个对象的方法.


    解析器跳过空格符和注释。如果下一个字节是“(”,判断对象为一个字符串。如果下一个字节是“[”,判断对象是一个数组。如果接下来的两个字节是“<<”,判断对象是一个字典。如果下一个字节是“<”,判断对象是一个十六进制字符串。如果下一个字节是“/”,判断对象是一个名称。如果下一个字节不是上述任何一种,解析器会采集随后的字节直到发现定界符。定界符不是当前标记符的一部分。标记符可以是整数,实数,操作符或关键词。在整数的情况下,程序将进一步搜索对象引用“n 0 R”或间接对象“n 0 obj”中 n 为该整数的对象。从 ParseNextItem() 返回的值是第4节“对象的定义”中所述的适当对象。对象的类作为 PdfBase 类返回。


    在数组或字典的情况下,程序将执行递归调用 ParseNextItem() 来解析数组或字典的内部对象。


    7. 文件读取


    PdfDocument 类是 PDF 文件分析的主要类。入口方法是 ReadPdfFile(String FileName)。程序以二进制读取的方式打开 PDF 文件(一次一个字节)。


    文件分析开始于检查头部签名 %PDF-1.x(x为0到7)和结尾签名%%EOF。有人会认为,所有的 PDF 生成器会把头部签名放在文件的零位置,结尾签名放在文件的最后。不幸的是,实际并非如此。程序必须在文件的两端搜索这两个签名。如果头部签名不在零位置,所有间接对象的文件位置的指针也必须调整。


    就在结尾签名的前面有一个指向最后一个交叉引用表开始位置的指针。
    ========

    Windows下的开源二进制文件编辑器HexEdit

    http://blog.okbase.net/haobao/archive/65.html
     
    作者:Andrew Phillips
     
    [译者按]HexEdit是一个伟大的软件,多少年来一直未伴随着我们,如今作者释放出全部源代码,真的让我们感激万分。本文摘录翻译了部分,原文请参见http://www.codeproject.com/Articles/135474/HexEdit-Window-Binary-File-Editor
      
    介绍
    我在去年公测后发布了hexedit 4.0正式版。测试版工作得很好,所以我并没有急于释放正式版,有些小BUG需要修复。
     
    HexEdit用C++编写,需要VS2008(带功能包)、VS2012或后续版本和MFC的支持。你很容易编译生成它,如果有问题请参阅“生成HexEdit 4.0”章节,现在也有一个工程文件是针对VS2012的。
     
    HexEdit(1999年)的第一个版本是开源的,但后来的版本是共享软件(虽然我一直坚持在做一个免费的版本)。hexedit的2.0开放源代码,因为它使用了一些BCG商业库。(BCG库是一个很好的MFC扩展库,所以我不后悔使用它。)幸运的是,几年前,微软买了BCG代码,并把它纳入MFC。所以,现在hexedit的4.0是第一次开源(见 http://www.hexedit.com);也有一个共享软件版本,可用于那些想为它支付的朋友(见 http://www.hexeditpro.com),增加了一些小功能。
     
    要生成hexedit 4.0中,您只需要Visual Studio,加上一些开放的源代码和库(其中大部分来自CodeProject)。您可以使用程序或任何的源代码,不管出于什么目的,你认为合适的,只要你遵守的相关许可要求(见下文)或任何包含第三方代码的具体要求。
     
    开发历史
     
    我在1997-1998写的HexEdit,当时工作中需要用到,而那时正缺少十六进制编辑器。
    hexedit被设计为易于使用和用户熟悉的Windows软件,就像MS Word和Visual Studio。事实上,它借鉴了一些常见的Windows程序的很多思路。
     
    代码文件
    HexEdit.h - CHexEditApp 类是应用程序类。
    Stdafx.h - 预编译头文件
    resource.h - 资源 IDs,用于 HexEdit.rc 和C++代码
     
    MainFrm.h - 主程序窗口MFC类
    ChildFrm.h - 处理每个文件的窗口类
    HexEditDoc.h - CHexEditDoc 类 (参阅 HexEditDoc.cpp, DocData.cpp, Template.cpp, BGSearch.cpp, BGAerial.cpp).
    HexEditView.h - CHexEditView 类(参阅 HexEditView.cpp 和 Printer.cpp)
    ScrView.h - CScrView 提供了可滚屏的视图 (CHexEditView的基类)
    DataFormatView.h - CDataFormatView 处理模板显示 (参阅 Template.cpp)
    AerialView.h - CAerialView class - 显示 aerial 视图 (参阅 BGAerial.cpp)
     
    Prop.h - 属性对话框类 (property sheet, property pages and controls)
    BookMarkDlg.h - CBookMarkDlg 对话框用于显示、添加书签(参见bookmark.h) 
    FindDlg.h - 查找对话框对应类 (property sheet and pages) 
    Explorer.h - HexEdit 浏览对话框 (dialog and control classes) 
    CalcDlg.h - CCalcDlg 计算器对话框类 (see also CalcEdit.h below)
     
    Options.h - 选项对话框的属性页
    DFFD*.h - 模板编辑对话框 
    TParseDlg.h - 模板编辑时使用的C/C++分析对话框 (参见TParse.h)
    NewFile.h - “新文件”和“插入块”对话框
    OpenSpecialDlg.h - 磁盘编辑打开特殊对话框 (参见SpecialList.h) 
    RecentFileDlg.h - 显示最近使用的文件对话框 (参见HexFileList.h) 
    CopyCSrc.h - CCopyCSrc对话框,用于 "Copy As C Source" 
    Algorithm.h - CAlgorithm 类用于加密算法对话框
    Password.h - CPassword 类用于密码加密对话框
    CompressDlg.h - zlib压缩对话框
    EmailDlg.h - 邮件对话框
    Tipdlg.h - 显示每日技巧
    Dialog.h - 在宏中使用的对话框 (GetStr CMacroMessage CSaveMessage CMultiplay
    - 还有CFileDialog 派生类,包括 CHexFileDialog)
    HexPrintDialog.h - 自定义打印对话框 (重载 MFC CPrintDialog 
    SaveDffd.h - 模板没有保存时的提示对话框 (save/save as/cancel) 
    NewScheme.h - small dialog used when creating a new color scheme 
    BookmarkFind.h - used by Find dialog when bookmarking found occurrences 
    DirDialog.h - directory selection dialog (see below)
     
    Splasher.h - CSplashWnd for splash screen (see below) 
    TipWnd.h - CWnd derived class to show a small "tip" window (see below) 
    TransparentListBox.h, TransparentStatic2.h - transparent controls (see below) 
    CCalcEdit.h - CCalcEdit class which handles calculator edit box 
    control.h - various text and combo controls used in dialogs and on toolbars
     
    GenDockablePane.h - dockable window used to makes Calculator, Find dialog etc dockable 
    ResizeCtrl.h - CResizeCtrl (see below) 
    BCGMisc.h - a few classes derived from BCG (now MFC) classes 
    UserTool.h - CHexEditUserTool is derived from CUserToolto allow command line substition for user tools 
    SimpleSplitter.h - CSimpleSplitter is used in Explorer dialog for the split between folder/file sections 
    HexEditSplitter.h - CHexEditSplitter allows showing aerial/template views in a split window 
    TabView.h - CHexTabView (derived from CTabView allows showing aerial/template views in tabs 
    CoordAp.h - CPointAp CSizeAp CRectAp (see below) for 64-bit (vertically) coordinate system
     
    TParser.h - 用于TParseDlg的C/C++代码分析器 (参阅下面的TParseDlg.h) 
    HexEditMacro.h - handles recording and playback of Keystroke macros 
    HexFileList.h - stores global list of all recent files 
    SpecialList.h - stores info about that volumes and raw disks in the system 
    Bookmark.h - CBookmarkList class for global storage for bookmarks 
    Scheme.h - CScheme stores all color schemes 
    NavManager.h - global storage of navigation points 
    SystemSound.h - CSystemSound contains static method for getting, setting, playing sounds (see below) 
    Timer.h - timer class can time events (see below)
     
    UpdateChecker.h - 通过Internet检测HexEdit的最新版本
    Xmltree.h - 封装了MS XML SDK
    BigInter.h - BigInteger 类用于处理大于64位的数字
    CFile64.h - CFile64 类用于64位文件处理 
    crypto.h - CCrypto 类封装了 Crypto API
    Boyer.h - boyer类用于搜索
    range_set.h - template class for set with ranges (see below) 
    Expr.h - expr_eval class handles C-like expressions (used in templates etc) 
    IntelHex.h - CReadIntelHexand CWriteIntelHex (see below) 
    SRecord.h - CReadSRecordand CWriteSRecord (see below)
     
    misc.h - 杂项全局函数
    md5.h - routines for generating an MD5 checksum
    ntapi.h - declarations for direct access to NT API (bypassing Windows) for disk editor 
    w2k_def.h - more NT (not 9X) info - included by ntapi.h 
    optypes.h - defines unary and binary operations (for Calculator and Operations menu)
    SVNRevisionTemplate.h - used by SVN uitlity to create SVNRevision.hSVNRevision.h - just stores 
     
    相关内容
    下载源代码:http://www.okbase.net/file/item/19711
    更多内容请参见http://www.codeproject.com/Articles/135474/HexEdit-Window-Binary-File-Editor
    ========
    展开全文
  • 随后阴老师使用我们所修正过的vb程序——二进制练习来对学生进行二的n次方、二进制转十进制和十进制转二进制的练习,程序会自动记录做题时间。要求做完后截屏,并且将图片上传,文件名为学号加名字。 在同学做练习...
  • 转载连接:... C读写二进制文件C二进制文件比较程序C Parsing 类实现的 PDF 文件分析器Windows下的开源二进制文件编辑器HexEdit C#读写二进制文件 http://www.cnblogs.com
  • 进数转换:1、二进制数、十六进制数转换为十进制数(按权求和) 二进制数、十六进制数转换为十进制数的规律是相同的。把二进制数(或十六进制数)按位权形式展开.计算机中常用的数的进制主要有:二进制、八进制、十六...
  • 北京信息科技大学信息管理学院实 验 报 告课程名称 信息系统基础实验项目 实验一 计算机数据信息化和指令执行过程实验仪器 PC、Office2003专 业 ****班级/学号 ***学生姓名 ***实验日期 ****实验地点 1-3-607成 绩...
  • 2019-10-07阅读(283)1.上电/全清键(ON/AC):按下该键表示上电,或清除所有寄存器中的数值.2....平方根√:2019-10-07阅读(2068)(一)计算器各部分名称和功能键说明“ON/C”键——打开计算器,消除显示器上的...
  • 最初是碰到*.sp红外光谱的谱图文件, 需要从谱图中读取数据, 进行定量计算.最初是Perkin Elmer的软件把*...后来, 无意间从mathworks.com的文件交换站上找到 Perkin Elmer公司的员工公布的读取该公司相关二进制文件的代
  • 2019-10-07阅读(129)先按shift键再按清除键就可以关掉啦计算器是现代人发明的可以进行数字运算的电子机器。自己看着计算器说的也算抄袭2019-10-07阅读(832)在任意幂数键的上方有一个开任意次方键,可以给任何一个数...
  • 由边长可以知道角度的sin,cos,tan值,拿任何一个值,比如说sin sinA = X 先输入X [再选择角度Degrees,数字下面] 选上Inv方框(如果不是电脑的计算器,按2ndF),按.计算器上有“pi”键 弧度 = 角度*pi/180你说的是...
  • 首先打开计算器电源(ON) 注:()代表注释 ( )代表第功能键 1.shift 2.(Pol) 3.1 4.shift 5.(,) 6.0 7.) 8.= 9.狂按分数线,直到按到顶不动为止(似乎是6个) 10.按= (显示Syntax ...
  • 学生用科学计算器如何关机按下CE键,等一会儿不使用就会自动关机。科学型计算可进行乘方、开方、指数、对数、三角函数、统计等方面的运算,又称函数计算器。科学型带有所有普通的函数,所有的函数都分布在键盘上...
  • 学生姓名 学 号 院 系 专 业 2011 年 9 月 9 日 C编写计算器程序 搞 要 本课程设计是在基于对话框的应用程序中模拟一个计算器计算器可以进行十进制下的四则运算加减乘除和四则混合运算可以把十进制转化为二进制...
  • PCalc是一款十分高效的万能mac科学计算器,能够支持广泛的单位换算常数、工程和科学记数法,以及支持十六进制、 八进制和二进制计算,十分全面。PCalc适用于科学家、 工程师、 学生等需要专业科学计算器人群。 ...
  • 计算器应能实现如下功能: 1)、二进制、八进制、十进制及十六进制数的加、减、乘、除、乘方等简单计算 2)、科学计算函数,包括正弦、余弦、正切、余切、开方、对数、指数等函数运算 3)、具备历史计算的记忆功能。
  • 单片机计算器

    2012-06-07 20:14:55
     3.30T0控制LED实现二进制计数  3.31TIMER0与TIMER1控制条形LED  3.3210s的秒表  3.33计数器中断实现100以内的按键计数  3.3410000s以内的计时程序  3.35定时器控制数码管动态显示  3.368×8LED点阵屏...
  • java计算器设计报告

    2014-06-23 21:16:29
    计算器是由java语言所编程设计的标准计算器,可以进行十进制下的四则运算(加、减、乘、除)、开平方、求余、求倒数,还可以实现二进制与十进制之间的转换。通过本课程设计使学生能够较全面的掌握面向对象程序设计...
  • 时计算工具的认识和用计算器计算..ppt清代八卦算盘 木制算盘 世界最长算盘10.1米 1946年美国宾夕法尼亚大学经过几年的艰苦努力,研制出世界上第一台电子计算机。随着科学技术的进步,计算机不断更新。目前,速度快的...
  • 《计算工具的认识》教案教学目标:使学生简单了解计算工具的发展(结绳记事、算筹等)。教学重点:认识各种计算工具。教学过程:(一)课前参与...()老师根据学生介绍的情况补充介绍计算工具的发展历史。计算工具的...
  • 进行乘方、开方、指数、对数、三角函数、统计等方面的运算 使用计算器可进行加(+)、减(-)、乘(*)、除(/)、开方(sqrt)、百分数(%)、倒数(1/x)等简单算术计算。 如果按错可用(Backspace)键消去一次数值,再重新输入...
  • 一共使用了建造者模式、状态模式、命令模式、策略模式、单件模式这5个设计模式。 本次课程设计是开发一款... 初等函数 二进制 八进制 十六进制 分解质因数 最简二次根式 一元二次方程 保留根号 小数转分数 循环小数
  • 一、计算器使用的状态 对于两类计算器来说,使用的是数值计算,所采用的状态是十进制状态: 1、学生计算器(KDT科灵通科学计算器):按模式键MODE选择进制状态或计算状态。 第一次屏幕显示Comp Sd Gre 1 2 3 普通计算...
  • 如果你是计算机专业的学生,那么一定曾经为十进制、十六进制、八进制、二进制等四种数制间的转换所苦恼。不过,只要你使用Win-dows中的计算器,那么一切就迎刃而解了。在“科学型”模式下,键入欲转换的数值,再单击...
  • 、功能描述:所谓GPA计算器,即进行GPA换算。  功能要求由如下几点:  1.学生成绩可以由文件导入。  2.GPA标准可以选择,也可以手动输入。  3.GPA的计算过程易于监督控制。  4.计算结果的可读性强。 三...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,657
精华内容 1,062
关键字:

学生用计算器二进制