日期:2014-05-18  浏览次数:21133 次

【两百分】两个没有得到答案的简单帖子,现在高分求答案!!!!
我的两个没有人回答的帖子,两个问题都不难。现在加分,求答案!

怎样验证CRC的正确性
http://topic.csdn.net/u/20081107/12/81254536-a073-4cc3-ad7e-da84fab6b9f9.html
引用
我写了CRC的程序,包括CRC8,CRC16,CRC32。我怎么验证这个程序的正确性?


怎样自动处理Stream?
http://topic.csdn.net/u/20081101/11/bbcdd714-daf1-4aab-b90f-ce5acef89d6a.html
引用
现在有一个Stream S,里面存的可能是字符串,也可能不是字符串。

现在我想把Stream里面的内容显示到一个textBox里面
1、如果Stream是字符串,就显示字符串的内容。
2、如果Stream不是字符串,显示Stream的16进制数据。就像WinHex一样。

这个怎么进行自动判断。

注:字符串可能有多种编码方案。


------解决方案--------------------
太高深了!!高处不胜寒??
------解决方案--------------------
同是CRC,不同的人理解不同
例如:在CRC描述中有
“取被校验串的一个字节与16 位寄存器的高位字节进行“异或”运算。运算结果放
入这个16 位寄存器。”
运算结果是到16位寄存器的高8位还是低8位,没有说清,记得一次国外提供的程序就是以把结果放到高8位中进行运算的。
其实此类算法需要根据实际情况进行验证。
如下是从C转成C#的,现在在很多项目中都用过。
C# code

        public static uint Calculate_Crc(String strData,int len)
        {

            uint  iCrcVal;
            int iIndex=0;
            iCrcVal = 0xffff;        //CRC初始值

            while(len-- !=0)
            {
                iCrcVal = iCrcVal ^ ((uint)(strData[iIndex++]) << 8);

                for(int i=0;i<8;i++)
                {
                    if (Convert.ToBoolean(iCrcVal & 0x0001))
                        iCrcVal = (iCrcVal >> 1) ^ 0xa001;
                    else
                        iCrcVal = iCrcVal >> 1;
                }
            }

            return iCrcVal;
        }

------解决方案--------------------
不是太懂,帮你顶一下,以表支持
------解决方案--------------------
高深啊!!
去外国网站看看吧!!
------解决方案--------------------
1、
发送数据1010110101100
CRC参数 10101
生成CRC校验码100

接受数据1010110101100-100/10101可以整除表示验证通过


通俗一点,传送一个数123456789,为了验证传送过程,我找一个除数17,然后余数1作为校验码。
传送123456789,17,1到另外一个地方,如果是123456786,17,1,那将产生错误。

现在一个问题诞生了,这样也没有太大加强系统的安全度,顶多是17倍,打住!真的只安全了17倍吗?!

假设一只小鸟1秒内被雷击中的几率是1/100,一只小鸟1秒内被小孩儿弹弓击中的几率是1/100,一只小鸟一秒内被噎死的几率是1/100
请问,一只小鸟一秒内被噎死,同时雷电和弹弓又同时击中的几率是多少?答案肯定不是1/300

因此,CRC参数的长度对于校验的准确度提升是指数级的。


2、关于stream,我想就是数据流,是不是字符串,怎么说呢?谁能保证stream里面没有英文字符的编码就没有中文字符?没有中文字符就没有阿拉伯文?
就没有我创建一种编码的字符串?我觉得这是两个不同的概念。不是非此即彼的关系。
大家都会相信,任意一个stream串都可以构造成字符串形式,只是构造的规则由谁定的问题。
如果非要解决这个问题,那就尽量搞清楚编码规则,特别是头尾格式。
 

------解决方案--------------------
首先定义全局变量 
char MYCRC[16]={0x11,0x11,0x11,0x11...};//16个0x11 
然后再找一个CRC算法,简单点就直接模二加 
代码: 
fopen(EXE文件),只读打开 
BYTE crc = 0; 
for(int i=0;i<filelen;i++) 
 crc = crc ^ filedata[i]; 
if( crc != MYCRC[0] ) 

ShowMessage("crc error"); 
return; 

编译OK,得到EXE文件。 
再另外新建立一个工程,名字叫getcrc.prj,专门统计某个文件的模二加值,代码参考: 
fopen(EXE文件),只读打开 
BYTE crc = 0; 
for(int i=0;i<filelen;i++) 
 crc = crc ^ filedata[i]; 
用UTRLEDIT或者其他HEX编辑器打开你的EXE文件, 
寻找一串0x11,0x11,0x11...的东西 
找到后把第一个0x11和第二个0x11都改为你用getcrc.exe得到你的EXE文件的CRC值。
(以上仅供楼主您参考)
------解决方案--------------------
首先定义全局变量 
char MYCRC[16]={0x11,0x11,0x11,0x11...};//16个0x11 
然后再找一个CRC算法,简单点就直接模二加 
代码: 
fopen(EXE文件),只读打开 
BYTE crc = 0; 
for(int i=0;i<filelen;i++) 
 crc = crc ^ filedata[i]; 
if( crc != MYCRC[0] )