怎么把这几段C语言代码转换成C#代码的??

shui8iuhs 2009-02-03 03:25:14
怎么把这几段C语言代码转换成C#代码的??
请各位XDJM们帮我看看。
在此先谢谢了。

(1)
uint8 CDT_BCH_Check(uint8 *pucBuff, uint8 ucCdtVer)
{
static const uint8 aucBchD709[]=
{
0x00, 0xE0, 0x70, 0x90, 0x38, 0xD8, 0x48, 0xA8,
0x1C, 0xFC, 0x6C, 0x8C, 0x24, 0xC4, 0x54, 0xB4,
0x0E, 0xEE, 0x7E, 0x9E, 0x36, 0xD6, 0x46, 0xA6,
0x12, 0xF2, 0x62, 0x82, 0x2A, 0xCA, 0x5A, 0xBA,
0x07, 0xE7, 0x77, 0x97, 0x3F, 0xDF, 0x4F, 0xAF,
0x1B, 0xFB, 0x6B, 0x8B, 0x23, 0xC3, 0x53, 0xB3,
0x09, 0xE9, 0x79, 0x99, 0x31, 0xD1, 0x41, 0xA1,
0x15, 0xF5, 0x65, 0x85, 0x2D, 0xCD, 0x5D, 0xBD,
0xE3, 0x03, 0x93, 0x73, 0xDB, 0x3B, 0xAB, 0x4B,
0xFF, 0x1F, 0x8F, 0x6F, 0xC7, 0x27, 0xB7, 0x57,
0xED, 0x0D, 0x9D, 0x7D, 0xD5, 0x35, 0xA5, 0x45,
0xF1, 0x11, 0x81, 0x61, 0xC9, 0x29, 0xB9, 0x59,
0xE4, 0x04, 0x94, 0x74, 0xDC, 0x3C, 0xAC, 0x4C,
0xF8, 0x18, 0x88, 0x68, 0xC0, 0x20, 0xB0, 0x50,
0xEA, 0x0A, 0x9A, 0x7A, 0xD2, 0x32, 0xA2, 0x42,
0xF6, 0x16, 0x86, 0x66, 0xCE, 0x2E, 0xBE, 0x5E,
0x91, 0x71, 0xE1, 0x01, 0xA9, 0x49, 0xD9, 0x39,
0x8D, 0x6D, 0xFD, 0x1D, 0xB5, 0x55, 0xC5, 0x25,
0x9F, 0x7F, 0xEF, 0x0F, 0xA7, 0x47, 0xD7, 0x37,
0x83, 0x63, 0xF3, 0x13, 0xBB, 0x5B, 0xCB, 0x2B,
0x96, 0x76, 0xE6, 0x06, 0xAE, 0x4E, 0xDE, 0x3E,
0x8A, 0x6A, 0xFA, 0x1A, 0xB2, 0x52, 0xC2, 0x22,
0x98, 0x78, 0xE8, 0x08, 0xA0, 0x40, 0xD0, 0x30,
0x84, 0x64, 0xF4, 0x14, 0xBC, 0x5C, 0xCC, 0x2C,
0x72, 0x92, 0x02, 0xE2, 0x4A, 0xAA, 0x3A, 0xDA,
0x6E, 0x8E, 0x1E, 0xFE, 0x56, 0xB6, 0x26, 0xC6,
0x7C, 0x9C, 0x0C, 0xEC, 0x44, 0xA4, 0x34, 0xD4,
0x60, 0x80, 0x10, 0xF0, 0x58, 0xB8, 0x28, 0xC8,
0x75, 0x95, 0x05, 0xE5, 0x4D, 0xAD, 0x3D, 0xDD,
0x69, 0x89, 0x19, 0xF9, 0x51, 0xB1, 0x21, 0xC1,
0x7B, 0x9B, 0x0B, 0xEB, 0x43, 0xA3, 0x33, 0xD3,
0x67, 0x87, 0x17, 0xF7, 0x5F, 0xBF, 0x2F, 0xCF
};
static const uint8 aucBchEb90[]=
{
0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
};
static const uint8 *pucTable;
uint16 unSize;
uint8 ucRslt;

if (ucCdtVer & BCH_DL451) pucTable=aucBchD709;
else pucTable=aucBchEb90;

for (ucRslt=0, unSize=5; unSize!=0; unSize--)
ucRslt=pucTable[ucRslt^(*pucBuff++)];

return (~ucRslt);
}

(2)
unsigned int cal_crc(unsigned char *ptr, unsigned char len) {
unsigned char i;
unsigned int crc=0;
while(len--!=0) {
for(i=0x80; i!=0; i/=2) {
if((crc&0x8000)!=0) {crc*=2; crc^=0x1021;} /* 余式CRC乘以2再求CRC */
else crc*=2;
if((*ptr&i)!=0) crc^=0x1021; /* 再加上本位的CRC */
}
ptr++;
}
return(crc);
}

(3)
unsigned int cal_crc(unsigned char *ptr, unsigned char len) {
unsigned int crc;
unsigned char da;
unsigned int crc_ta[256]={ /* CRC余式表 */
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x 1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
};

crc=0;
while(len--!=0) {
da=(uchar) (crc/256); /* 以8位二进制数的形式暂存CRC的高8位 */
crc < <=8; /* 左移8位,相当于CRC的低8位乘以 */
crc^=crc_ta[da^*ptr]; /* 高8位和当前字节相加后再查表求CRC ,再加上以前的CRC */
ptr++;
}
return(crc);
}
...全文
357 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
TANXUDONG2009 2009-10-12
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static double ApplyFuzzyOperation(double a,double b)
{
return Math.Min(a, b);
}

static void Main(string[] args)
{
FuzzySet_Guass U_NB = new FuzzySet_Guass(3, -10, -10, 10, 1000, "U_PB");
FuzzySet_Guass U_PB = new FuzzySet_Guass(3, 10, -10, 10, 1000, "U_PB");

FuzzySet_Guass E_NB = new FuzzySet_Guass(3, -10, -10, 10, 1000, "E_NB");
FuzzySet_Guass E_PB = new FuzzySet_Guass(3, 10, -10, 10, 1000, "E_PB");

FuzzySet_Guass EC_NB = new FuzzySet_Guass(3, -10, -10, 10, 1000, "EC_NB");
FuzzySet_Guass EC_PB = new FuzzySet_Guass(3, 10, -10, 10, 1000, "EC_PB");


while(true)
{


Console.WriteLine("e=");

double input1 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("ec=");
double input2 = Convert.ToDouble(Console.ReadLine());

//step1
double e1 = E_NB.FuzzifyInput(input1);
double ec1 = EC_NB.FuzzifyInput(input2);


//step2
double a1=ApplyFuzzyOperation(e1, ec1);



//step3
U_NB.ApplyImplicationMethod(a1);//被改变的U_PB


//step1
double e2 = E_PB.FuzzifyInput(input1);
double ec2 = EC_PB.FuzzifyInput(input2);


//step2
double a2 = ApplyFuzzyOperation(e2, ec2);



//step3
U_PB.ApplyImplicationMethod(a2);//被改变的U_NB


//step4
U_PB.ApplyAggregationMethod(U_NB);//被改变的U_PB


//step5
double u = U_PB.Defuzzify();
Console.WriteLine("u=\n{0}\n",u);
}
}
}



public class FuzzySet_Guass
{
double m_sigma;
double m_aver;

double m_border_left;
double m_border_right;

double m_points;

string m_name;

double[] m_data;

public void ApplyAggregationMethod(FuzzySet_Guass set1)
{
for (int i = 0; i < set1.m_data.Length;i++ )
{
this.m_data[i] = Math.Max(this.m_data[i], set1.m_data[i]);
}
}

public FuzzySet_Guass(double sigma, double aver, double border_left, double border_right, int points,string name)
{
m_sigma = sigma;
m_aver = aver;
m_border_left = border_left;
m_border_right = border_right;
m_points = points;
m_name = name;

m_data=new double[points+1];


double x = m_border_left;
for(int i=0;i<this.m_data.Length;i++)
{
x = m_border_left + i * (m_border_right - m_border_left) / m_points;
m_data[i]=Gauss(x, m_sigma, m_aver);
}
}

public double FuzzifyInput(double accurate_input)
{
return Gauss(accurate_input, m_sigma, m_aver);
}

public void ApplyImplicationMethod(double a)
{
for(int i=0;i<this.m_data.Length;i++)
{
this.m_data[i] = Math.Min(a,this.m_data[i]);
}
}

public double Defuzzify()
{
double numerator=0;

double denominator = 0;
double x=0;

for (int i = 0; i < this.m_data.Length;i++ )
{
x = m_border_left + i * (m_border_right - m_border_left) / m_points;
numerator += x * this.m_data[i];

denominator += this.m_data[i];
}

return numerator / denominator;
}

public void PrintFuzzySetElements()
{
Console.WriteLine("Fuzzy Set -- "+this.m_name);
foreach (double v in m_data)
{
Console.WriteLine(v);
}
Console.WriteLine();

for (int i = 0; i < this.m_data.Length; i++)
{
double x = m_border_left + i * (m_border_right - m_border_left) / m_points;
Console.WriteLine("i={0},data={1},x={2}",i,this.m_data[i],x);
}
Console.WriteLine();
}

double Gauss(double x, double sigma, double aver)
{
return Math.Pow(Math.E, -Math.Pow((x - aver) / sigma, 2)/2);
}
}
}
有谁可以帮我将此C#代码转换成C代码?
TANXUDONG2009 2009-10-12
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static double ApplyFuzzyOperation(double a,double b)
{
return Math.Min(a, b);
}

static void Main(string[] args)
{
FuzzySet_Guass U_NB = new FuzzySet_Guass(3, -10, -10, 10, 1000, "U_PB");
FuzzySet_Guass U_PB = new FuzzySet_Guass(3, 10, -10, 10, 1000, "U_PB");

FuzzySet_Guass E_NB = new FuzzySet_Guass(3, -10, -10, 10, 1000, "E_NB");
FuzzySet_Guass E_PB = new FuzzySet_Guass(3, 10, -10, 10, 1000, "E_PB");

FuzzySet_Guass EC_NB = new FuzzySet_Guass(3, -10, -10, 10, 1000, "EC_NB");
FuzzySet_Guass EC_PB = new FuzzySet_Guass(3, 10, -10, 10, 1000, "EC_PB");


while(true)
{


Console.WriteLine("e=");

double input1 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("ec=");
double input2 = Convert.ToDouble(Console.ReadLine());

//step1
double e1 = E_NB.FuzzifyInput(input1);
double ec1 = EC_NB.FuzzifyInput(input2);


//step2
double a1=ApplyFuzzyOperation(e1, ec1);



//step3
U_NB.ApplyImplicationMethod(a1);//被改变的U_PB


//step1
double e2 = E_PB.FuzzifyInput(input1);
double ec2 = EC_PB.FuzzifyInput(input2);


//step2
double a2 = ApplyFuzzyOperation(e2, ec2);



//step3
U_PB.ApplyImplicationMethod(a2);//被改变的U_NB


//step4
U_PB.ApplyAggregationMethod(U_NB);//被改变的U_PB


//step5
double u = U_PB.Defuzzify();
Console.WriteLine("u=\n{0}\n",u);
}
}
}



public class FuzzySet_Guass
{
double m_sigma;
double m_aver;

double m_border_left;
double m_border_right;

double m_points;

string m_name;

double[] m_data;

public void ApplyAggregationMethod(FuzzySet_Guass set1)
{
for (int i = 0; i < set1.m_data.Length;i++ )
{
this.m_data[i] = Math.Max(this.m_data[i], set1.m_data[i]);
}
}

public FuzzySet_Guass(double sigma, double aver, double border_left, double border_right, int points,string name)
{
m_sigma = sigma;
m_aver = aver;
m_border_left = border_left;
m_border_right = border_right;
m_points = points;
m_name = name;

m_data=new double[points+1];


double x = m_border_left;
for(int i=0;i<this.m_data.Length;i++)
{
x = m_border_left + i * (m_border_right - m_border_left) / m_points;
m_data[i]=Gauss(x, m_sigma, m_aver);
}
}

public double FuzzifyInput(double accurate_input)
{
return Gauss(accurate_input, m_sigma, m_aver);
}

public void ApplyImplicationMethod(double a)
{
for(int i=0;i<this.m_data.Length;i++)
{
this.m_data[i] = Math.Min(a,this.m_data[i]);
}
}

public double Defuzzify()
{
double numerator=0;

double denominator = 0;
double x=0;

for (int i = 0; i < this.m_data.Length;i++ )
{
x = m_border_left + i * (m_border_right - m_border_left) / m_points;
numerator += x * this.m_data[i];

denominator += this.m_data[i];
}

return numerator / denominator;
}

public void PrintFuzzySetElements()
{
Console.WriteLine("Fuzzy Set -- "+this.m_name);
foreach (double v in m_data)
{
Console.WriteLine(v);
}
Console.WriteLine();

for (int i = 0; i < this.m_data.Length; i++)
{
double x = m_border_left + i * (m_border_right - m_border_left) / m_points;
Console.WriteLine("i={0},data={1},x={2}",i,this.m_data[i],x);
}
Console.WriteLine();
}

double Gauss(double x, double sigma, double aver)
{
return Math.Pow(Math.E, -Math.Pow((x - aver) / sigma, 2)/2);
}
}
}
空心兜兜 2009-02-05
  • 打赏
  • 举报
回复
好复杂..
shui8iuhs 2009-02-05
  • 打赏
  • 举报
回复
谢谢谢谢啊~
晓轩 2009-02-05
  • 打赏
  • 举报
回复
private	void CRC16(byte[] data ) 
{
byte CRC16Lo , CRC16Hi; //'CRC寄存器
byte CL , CH; //'多项式码&HA001
byte SaveHi,SaveLo;
byte [] CRCres;
CRCres = new byte [2];
int i,Flag;
CRC16Lo = 255;
CRC16Hi = 255;
CL = 1;
CH = 160;
for (i = 0;i<data.Length;i++)
{
CRC16Lo ^= data[i]; //'每一个数据与CRC寄存器进行异或
for (Flag = 0;Flag<=7;Flag++)
{
SaveHi = CRC16Hi;
SaveLo = CRC16Lo;
CRC16Hi >>= 1 ; //'高位右移一位
CRC16Lo >>=1 ; //'低位右移一位
if ((SaveHi & 1) == 1) // '如果高位字节最后一位为1
{
CRC16Lo|= 128; // '则低位字节右移后前面补1
} //'否则自动补0
if ((SaveLo & 1) ==1) //'如果LSB为1,则与多项式码进行异或
{
CRC16Hi ^= CH;
CRC16Lo ^= CL;
}
}
}

CRCres[0] = CRC16Lo; //'CRC高位 CRC16Hi
CRCres[1] = CRC16Hi; //'CRC低位 CRC16Lo
}

本机调试通过。测试byte 数组
byte [] tmpar;
tmpar=new byte [6];
tmpar[0] = 1;
tmpar[1] = 3;
tmpar[2] =0;
tmpar[3] = 0;
tmpar[4] = 0;
tmpar[5] = 4;
CRC16 (tmpar);
校验结果:高位9:低位68
Mike老羊 2009-02-05
  • 打赏
  • 举报
回复
.........................
shui8iuhs 2009-02-05
  • 打赏
  • 举报
回复
报这些错,是什么意思哦??我要怎么改呢???
错误 7 当前上下文中不存在名称“HFF” E:\李丽丽\TEST\SerialPortDemo\Class5.cs 17 24 SerialPortDemo
错误 8 当前上下文中不存在名称“HFF” E:\XXX\TEST\SerialPortDemo\Class5.cs 18 24 SerialPortDemo
错误 9 当前上下文中不存在名称“H1” E:\XXX\TEST\SerialPortDemo\Class5.cs 19 19 SerialPortDemo
错误 10 当前上下文中不存在名称“HA0” E:\XXX\TEST\SerialPortDemo\Class5.cs 20 19 SerialPortDemo
错误 11 当前上下文中不存在名称“H1” E:\XXX\TEST\SerialPortDemo\Class5.cs 30 36 SerialPortDemo
错误 12 当前上下文中不存在名称“H1” E:\XXX\TEST\SerialPortDemo\Class5.cs 30 44 SerialPortDemo
错误 13 当前上下文中不存在名称“H80” E:\XXX\TEST\SerialPortDemo\Class5.cs 32 46 SerialPortDemo
错误 14 当前上下文中不存在名称“H1” E:\XXX\TEST\SerialPortDemo\Class5.cs 34 36 SerialPortDemo
错误 15 当前上下文中不存在名称“H1” E:\XXX\TEST\SerialPortDemo\Class5.cs 34 44 SerialPortDemo
晓轩 2009-02-05
  • 打赏
  • 举报
回复
	private	void CRC16(byte[] data ) 
{
byte CRC16Lo , CRC16Hi; //'CRC寄存器
byte CL , CH; //'多项式码&HA001
byte SaveHi,SaveLo;
byte [] CRCres;
CRCres = new byte [2];
int i,Flag;
CRC16Lo = &HFF;
CRC16Hi = &HFF;
CL = &H1;
CH = &HA0;
for (i = 0;i<data.Length-1;i++)
{
CRC16Lo = CRC16Lo ^ data(i); //'每一个数据与CRC寄存器进行异或
for (Flag = 0;Flag<=7;Flag++)
{
SaveHi = CRC16Hi;
SaveLo = CRC16Lo;
CRC16Hi = CRC16Hi / 2; //'高位右移一位
CRC16Lo = CRC16Lo / 2 ; //'低位右移一位
if ((SaveHi & &H1) == &H1) // '如果高位字节最后一位为1
{
CRC16Lo = CRC16Lo | &H80; // '则低位字节右移后前面补1
} //'否则自动补0
if ((SaveLo & &H1) == &H1) //'如果LSB为1,则与多项式码进行异或
{
CRC16Hi = CRC16Hi ^ CH;
CRC16Lo = CRC16Lo ^ CL;
}
}
}

CRCres(0) = CRC16Lo; //'CRC高位 CRC16Hi
CRCres(1) = CRC16Hi; //'CRC低位 CRC16Lo
}
shui8iuhs 2009-02-05
  • 打赏
  • 举报
回复
谢谢楼上的,但是我没学过VB,我只会C#,或者.NET,你有C#,或者.NET的方法吗??
晓轩 2009-02-05
  • 打赏
  • 举报
回复
Public Function ModbusCRC(ByVal STR1 As String) As String
Dim CRCREG As Long
Dim MVAL As Long
Dim R, t As Integer
CRCREG = 65535
For R = 1 To Len(STR1) Step 2
MVAL = Val("&H" + Mid(STR1, R, 2))
CRCREG = CRCREG Xor MVAL
CRCREG = CRCREG And 65535
For t = 1 To 8 Step 1
If (CRCREG And &H1) Then
CRCREG = (CRCREG \ 2) Xor &HA001
CRCREG = CRCREG And 65535
Else
CRCREG = CRCREG \ 2
CRCREG = CRCREG And 65535
End If
Next
Next
Dim A As Long
Dim B As Long
A = CRCREG And 255
B = CRCREG And 65280
A = A * 256
B = B / 256

If (A + B) < 16 Then
ModbusCRC = "000" + Hex(A + B)
ElseIf (A + B) < 256 Then
ModbusCRC = "00" + Hex(A + B)
ElseIf (A + B) < 4096 Then
ModbusCRC = "0" + Hex(A + B)
Else
ModbusCRC = Hex(A + B)
End If
End Function
'PLC 16位CRC校验。低在前
Sub CRC16(ByVal data() As Byte, ByVal tag As Boolean)
Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器
Dim CL As Byte, CH As Byte '多项式码&HA001
Dim SaveHi As Byte, SaveLo As Byte
Dim i As Integer
Dim Flag As Integer
CRC16Lo = &HFF
CRC16Hi = &HFF
CL = &H1
CH = &HA0
For i = 0 To UBound(data)
CRC16Lo = CRC16Lo Xor data(i) '每一个数据与CRC寄存器进行异或
For Flag = 0 To 7
SaveHi = CRC16Hi
SaveLo = CRC16Lo
CRC16Hi = CRC16Hi \ 2 '高位右移一位
CRC16Lo = CRC16Lo \ 2 '低位右移一位
If ((SaveHi And &H1) = &H1) Then '如果高位字节最后一位为1
CRC16Lo = CRC16Lo Or &H80 '则低位字节右移后前面补1
End If '否则自动补0
If ((SaveLo And &H1) = &H1) Then '如果LSB为1,则与多项式码进行异或
CRC16Hi = CRC16Hi Xor CH
CRC16Lo = CRC16Lo Xor CL
End If
Next Flag
Next i
If tag = True Then
data(11) = CRC16Lo 'CRC高位 CRC16Hi
data(12) = CRC16Hi 'CRC低位 CRC16Lo
Else
data(19) = CRC16Lo
data(20) = CRC16Hi
End If
End Sub

针对两种设备的crc校验。vb代码。相信转换vb代码应该easy些。
不行的话再联系。
shui8iuhs 2009-02-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xiaoxuanZhu 的回复:]
LZ貌似查表crc校验?我有通过计算获得的crc方法不知道楼主用不?
[/Quote]

您有通过计算获得的crc方法吗,可以发给我吗?我的邮箱是:shui8iuhs@yahoo.com.cn
在此非常感谢。
晓轩 2009-02-05
  • 打赏
  • 举报
回复
LZ貌似查表crc校验?我有通过计算获得的crc方法不知道楼主用不?
byte377 2009-02-05
  • 打赏
  • 举报
回复
UP
hack8 2009-02-05
  • 打赏
  • 举报
回复
如果单纯的将上面的代码转换为C#那么你只需要将数据类型对应的进行改变,同时如果你不想使用非托管的C#代码的话,那么就将指针对应到C#中的相应类型的数组,这个只是时间问题。
周药师 2009-02-05
  • 打赏
  • 举报
回复
up...
wenrenhua08 2009-02-04
  • 打赏
  • 举报
回复
up,顶一下
ztenv 2009-02-03
  • 打赏
  • 举报
回复
曾经的曾经用delphi写过......
ztenv 2009-02-03
  • 打赏
  • 举报
回复
这是那个crc循环校验的代码吧?
DNN-2017 2009-02-03
  • 打赏
  • 举报
回复
up
shui8iuhs 2009-02-03
  • 打赏
  • 举报
回复
(4)
unsigned cal_crc(unsigned char *ptr, unsigned char len) {
unsigned int crc;
unsigned char da;
unsigned int crc_ta[16]={ /* CRC余式表 */
0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
}

crc=0;
while(len--!=0) {
da=((uchar)(crc/256))/16; /* 暂存CRC的高四位 */
crc < <=4; /* CRC右移4位,相当于取CRC的低12位)*/
crc^=crc_ta[da^(*ptr/16)]; /* CRC的高4位和本字节的前半字节相加后查表计算CRC,
然后加上上一次CRC的余数 */
da=((uchar)(crc/256))/16; /* 暂存CRC的高4位 */
crc < <=4; /* CRC右移4位, 相当于CRC的低12位) */
crc^=crc_ta[da^(*ptr&0x0f)]; /* CRC的高4位和本字节的后半字节相加后查表计算CRC,
然后再加上上一次CRC的余数 */
ptr++;
}
return(crc);
}

(5)
#include <stdio.h>

unsigned char crc8_table[256] = {
0x00, 0x31, 0x62, 0x53, 0xc4, 0xf5, 0xa6, 0x97,
0x88, 0xb9, 0xea, 0xdb, 0x4c, 0x7d, 0x2e, 0x1f,
0x21, 0x10, 0x43, 0x72, 0xe5, 0xd4, 0x87, 0xb6,
0xa9, 0x98, 0xcb, 0xfa, 0x6d, 0x5c, 0x0f, 0x3e,
0x73, 0x42, 0x11, 0x20, 0xb7, 0x86, 0xd5, 0xe4,
0xfb, 0xca, 0x99, 0xa8, 0x3f, 0x0e, 0x5d, 0x6c,
0x52, 0x63, 0x30, 0x01, 0x96, 0xa7, 0xf4, 0xc5,
0xda, 0xeb, 0xb8, 0x89, 0x1e, 0x2f, 0x7c, 0x4d,
0xe6, 0xd7, 0x84, 0xb5, 0x22, 0x13, 0x40, 0x71,
0x6e, 0x5f, 0x0c, 0x3d, 0xaa, 0x9b, 0xc8, 0xf9,
0xc7, 0xf6, 0xa5, 0x94, 0x03, 0x32, 0x61, 0x50,
0x4f, 0x7e, 0x2d, 0x1c, 0x8b, 0xba, 0xe9, 0xd8,
0x95, 0xa4, 0xf7, 0xc6, 0x51, 0x60, 0x33, 0x02,
0x1d, 0x2c, 0x7f, 0x4e, 0xd9, 0xe8, 0xbb, 0x8a,
0xb4, 0x85, 0xd6, 0xe7, 0x70, 0x41, 0x12, 0x23,
0x3c, 0x0d, 0x5e, 0x6f, 0xf8, 0xc9, 0x9a, 0xab,
0xcc, 0xfd, 0xae, 0x9f, 0x08, 0x39, 0x6a, 0x5b,
0x44, 0x75, 0x26, 0x17, 0x80, 0xb1, 0xe2, 0xd3,
0xed, 0xdc, 0x8f, 0xbe, 0x29, 0x18, 0x4b, 0x7a,
0x65, 0x54, 0x07, 0x36, 0xa1, 0x90, 0xc3, 0xf2,
0xbf, 0x8e, 0xdd, 0xec, 0x7b, 0x4a, 0x19, 0x28,
0x37, 0x06, 0x55, 0x64, 0xf3, 0xc2, 0x91, 0xa0,
0x9e, 0xaf, 0xfc, 0xcd, 0x5a, 0x6b, 0x38, 0x09,
0x16, 0x27, 0x74, 0x45, 0xd2, 0xe3, 0xb0, 0x81,
0x2a, 0x1b, 0x48, 0x79, 0xee, 0xdf, 0x8c, 0xbd,
0xa2, 0x93, 0xc0, 0xf1, 0x66, 0x57, 0x04, 0x35,
0x0b, 0x3a, 0x69, 0x58, 0xcf, 0xfe, 0xad, 0x9c,
0x83, 0xb2, 0xe1, 0xd0, 0x47, 0x76, 0x25, 0x14,
0x59, 0x68, 0x3b, 0x0a, 0x9d, 0xac, 0xff, 0xce,
0xd1, 0xe0, 0xb3, 0x82, 0x15, 0x24, 0x77, 0x46,
0x78, 0x49, 0x1a, 0x2b, 0xbc, 0x8d, 0xde, 0xef,
0xf0, 0xc1, 0x92, 0xa3, 0x34, 0x05, 0x56, 0x67};

unsigned char get_value( unsigned short crc )
{
unsigned char i = 0;
for(i = 0; i < 9; i++ )
{
if( (crc&0x0100) !=0 )
{
crc*=2;
crc^=0x31;
}
else
{
crc*=2;
}
}

return (unsigned char)crc;
}

void init_tabl()
{
unsigned short i = 0;
for ( i = 0; i < 0x100; i++ )
{
crc8_table[i] = get_value(i);
if ( !(i%8) )
{
printf( "\n " );
}
printf( "0x%.2x, ", crc8_table[i] );
}
}

unsigned char count_crc8( unsigned char* pbuf, int len, unsigned char seed )
{
unsigned char* data = pbuf;
unsigned char crc = seed;
while ( len-- )
{
crc = crc8_table[crc^*(data++)];
}
return crc;
}

void main()
{
unsigned char data[32] = {1,2,3,4,5,6,7,8,9,10};
unsigned char crc_v = 0;
crc_v = count_crc8( data, 31, 0 );
data[31] = crc_v;
crc_v = count_crc8( data, 32, 0 );
}

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧