读书人

【两百分】两个没有得到答案的简单帖子

发布时间: 2012-01-20 18:53:53 作者: rapoo

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

怎样验证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] )


{
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值。
(以上仅供楼主您参考)
[解决办法]
up
[解决办法]
不大懂 up
[解决办法]
up
[解决办法]
up
[解决办法]
我回答第二个问题
分两步得到Stream的实例对象后 可以GETTYPE一下。判断它的真实强类型。
对NET类库中于那几个特殊的指定用途的字符串Stream可以直接当字符串处理。
然后对于通用型的STREAM来说 需要你尝试读取一下。可以只读24 * N字节就可以了。比如判断长度超过240字节的话 只读出240字节 。
TRY Encoding.default.getstring()。。。 如果出了异常你就再重头读出全部内容直接输出16进制数据可以。
如果没有异常,你还拿这240字节内容去分析编码格式(网上有很多范本代码来估算编码。如果找不到,我可以给你一份。)
如果你估算出有效编码(估算值最高的一种,如果最高不超过50%,那就算无效估算),就用ENCODING.GETENCODE(name)来构建编码ENCODING对象,然后吧全部内容来GETSTRING()。
如果估算结果没有发现有效编码,那就输出16数据了。

读书人网 >C#

热点推荐