求各位大神将下面c++代码转换成java代码!

Jo123mn 2017-01-13 10:41:19
C++以前学过一点点,但是现在接不上忘光了,碰见C++里面操作地址之类完全不知道怎么解决,求大神将线面这段代码转换成java语言!
get_CRC( const void * pBuf, int len )
{
//TODO: implement crc
unsigned int crc = 0;
unsigned char i;
unsigned char *ptr = (unsigned char *)pBuf;
while( len-- ) {
for(i = 0x80; i != 0; i = i >> 1) {
if((crc & 0x8000) != 0) {
crc = crc << 1;
crc = crc ^ 0x1021;
}
else {
crc = crc << 1;
}
if((*ptr & i) != 0) {
crc = crc ^ 0x1021;
}
}
ptr++;
}
return crc;
}
...全文
1019 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jo123mn 2017-01-13
  • 打赏
  • 举报
回复
引用 9 楼 u014185468 的回复:
[quote=引用 7 楼 bree06 的回复:] unsigned char的取值范围0~255远超java的byte-128 --127, c++的unsigned char对应java的char的正数部分, 返回值unsigned int 对应java的long正数部分. 拿"abネ"去测试一下就知道效果了.
用这个测试好像是有点问题。。。 能否再帮我看一下方法啊!
int JasDevID::serialize(uint8_t * pBuf )
{

	//chunk head
	uint32_t chunk_size	= CHUNK_SIZE;
	uint16_t chunk_id	= CHUNK_ID;
	uint16_t chunk_ver = CHUNK_VER;

	memcpy(pBuf,&chunk_size,4);
	pBuf+=4;

	memcpy(pBuf,&chunk_id,2);
	pBuf+=2;

	memcpy(pBuf,&chunk_ver,2);
	pBuf+=2;

	// chunk data
	uint8_t * pBufDataStart = pBuf;

	memcpy(pBuf,guid,GUID_LEN);
	pBuf+=GUID_LEN;

	memcpy(pBuf,pn,PN_LEN);
	pBuf+=PN_LEN;

	memcpy(pBuf,sn,SN_LEN);
	pBuf+=SN_LEN;

	// chunk crc
	int crc = Utility::get_CRC(pBufDataStart, CHUNK_SIZE);
	memcpy(pBuf,&crc,sizeof(int));

	return 0;

}
实在不会啊[/quote] 这个里面的pBuf+=4,这样的代码,这是在他的内存地址上加4吧,根本不知道在Java里面咋处理。。。
Jo123mn 2017-01-13
  • 打赏
  • 举报
回复
引用 7 楼 bree06 的回复:
unsigned char的取值范围0~255远超java的byte-128 --127, c++的unsigned char对应java的char的正数部分, 返回值unsigned int 对应java的long正数部分. 拿"abネ"去测试一下就知道效果了.
用这个测试好像是有点问题。。。 能否再帮我看一下方法啊!
int JasDevID::serialize(uint8_t * pBuf )
{

	//chunk head
	uint32_t chunk_size	= CHUNK_SIZE;
	uint16_t chunk_id	= CHUNK_ID;
	uint16_t chunk_ver = CHUNK_VER;

	memcpy(pBuf,&chunk_size,4);
	pBuf+=4;

	memcpy(pBuf,&chunk_id,2);
	pBuf+=2;

	memcpy(pBuf,&chunk_ver,2);
	pBuf+=2;

	// chunk data
	uint8_t * pBufDataStart = pBuf;

	memcpy(pBuf,guid,GUID_LEN);
	pBuf+=GUID_LEN;

	memcpy(pBuf,pn,PN_LEN);
	pBuf+=PN_LEN;

	memcpy(pBuf,sn,SN_LEN);
	pBuf+=SN_LEN;

	// chunk crc
	int crc = Utility::get_CRC(pBufDataStart, CHUNK_SIZE);
	memcpy(pBuf,&crc,sizeof(int));

	return 0;

}
实在不会啊
Jo123mn 2017-01-13
  • 打赏
  • 举报
回复
引用 7 楼 bree06 的回复:
unsigned char的取值范围0~255远超java的byte-128 --127, c++的unsigned char对应java的char的正数部分, 返回值unsigned int 对应java的long正数部分. 拿"abネ"去测试一下就知道效果了.
我测试看看
bree06 2017-01-13
  • 打赏
  • 举报
回复
unsigned char的取值范围0~255远超java的byte-128 --127, c++的unsigned char对应java的char的正数部分, 返回值unsigned int 对应java的long正数部分. 拿"abネ"去测试一下就知道效果了.
Jo123mn 2017-01-13
  • 打赏
  • 举报
回复
引用 3 楼 ipqtjmqj 的回复:

class crc
{
public static int get_CRC(byte[] buf)
{
int crc = 0;
int i;
for (int index = 0; index != buf.length; ++index) {
for (i = 0x80; i != 0; i >>>= 1) {
if ((crc & 0x8000) != 0) {
crc <<= 1;
crc ^= 0x1021;
} else {
crc <<= 1;
}
if ((buf[index] & i) != 0) {
crc ^= 0x1021;
}
}
}
return crc;
}
public static void main(String[] args)
{
byte[] buf = {0x31, 0x14, 0x15, (byte)0x92, 0x66};
System.out.println(get_CRC(buf));
}
}


已改正,测试可用


大神好厉害!这些文件我纠结一天多还没转换出来,能不能再请大神转换一个函数。。。。
int JasDevID::serialize(uint8_t * pBuf )
{

//chunk head
uint32_t chunk_size = CHUNK_SIZE;
uint16_t chunk_id = CHUNK_ID;
uint16_t chunk_ver = CHUNK_VER;

memcpy(pBuf,&chunk_size,4);
pBuf+=4;

memcpy(pBuf,&chunk_id,2);
pBuf+=2;

memcpy(pBuf,&chunk_ver,2);
pBuf+=2;

// chunk data
uint8_t * pBufDataStart = pBuf;

memcpy(pBuf,guid,GUID_LEN);
pBuf+=GUID_LEN;

memcpy(pBuf,pn,PN_LEN);
pBuf+=PN_LEN;

memcpy(pBuf,sn,SN_LEN);
pBuf+=SN_LEN;

// chunk crc
int crc = Utility::get_CRC(pBufDataStart, CHUNK_SIZE);
memcpy(pBuf,&crc,sizeof(int));

return 0;

}
保证最后一个,剩下的我参考你的写:)
ipqtjmqj 2017-01-13
  • 打赏
  • 举报
回复
测了一组数据,用c++版与java版代码运行结果一致 c++: http://ideone.com/NoOPGj java: http://ideone.com/R1exF7
Jo123mn 2017-01-13
  • 打赏
  • 举报
回复
引用 1 楼 ipqtjmqj 的回复:
我对java不太熟悉,不保证正确。下面代码只是编译通过,运行未测试

class crc
{
public void get_CRC(byte[] buf, int len)
{
	int crc = 0;
	byte i;
	for (int index = 0; index != buf.length; ++index) {
		for (i = (byte)0x80; i != 0; i >>= 1) {
			if ((crc & 0x8000) != 0) {
				crc <<= 1;
				crc ^= 0x1021;
			} else {
				crc <<= 1;
			} 
			if (buf[index] != 0) {
				crc ^= 0x1021;
			}
		}
	}
}

}

小白感知不尽!!!对我帮助灰常大!一会我就研究研究代码!
ipqtjmqj 2017-01-13
  • 打赏
  • 举报
回复

class crc
{
public static int get_CRC(byte[] buf)
{
	int crc = 0;
	int i;
	for (int index = 0; index != buf.length; ++index) {
		for (i = 0x80; i != 0; i >>>= 1) {
			if ((crc & 0x8000) != 0) {
				crc <<= 1;
				crc ^= 0x1021;
			} else {
				crc <<= 1;
			} 
			if ((buf[index] & i) != 0) {
				crc ^= 0x1021;
			}
		}
	}
	return crc;
}
public static void main(String[] args)
{
	byte[] buf = {0x31, 0x14, 0x15, (byte)0x92, 0x66};
	System.out.println(get_CRC(buf));
}
}

已改正,测试可用
bree06 2017-01-13
  • 打赏
  • 举报
回复
long get_CRC(String pBuf, int len) {
    //TODO: implement crc
    int crc = 0;
    char[] cs = pBuf.toCharArray();
    for (int i = 0; i < cs.length; i++) {
        cs[i] &= 0xff;
    }
    int j = 0;
    while (len-- > 0) {
        for (int i = 0x80; i != 0; i = i >> 1) {
            if ((crc & 0x8000) != 0) {
                crc = crc << 1;
                crc = crc ^ 0x1021;
            } else {
                crc = crc << 1;
            }
            if ((cs[j] & i) != 0) {
                crc = crc ^ 0x1021;
            }
        }
        j++;
    }
    return crc;
}
ipqtjmqj 2017-01-13
  • 打赏
  • 举报
回复
我对java不太熟悉,不保证正确。下面代码只是编译通过,运行未测试

class crc
{
public void get_CRC(byte[] buf, int len)
{
	int crc = 0;
	byte i;
	for (int index = 0; index != buf.length; ++index) {
		for (i = (byte)0x80; i != 0; i >>= 1) {
			if ((crc & 0x8000) != 0) {
				crc <<= 1;
				crc ^= 0x1021;
			} else {
				crc <<= 1;
			} 
			if (buf[index] != 0) {
				crc ^= 0x1021;
			}
		}
	}
}

}

Jo123mn 2017-01-13
  • 打赏
  • 举报
回复
引用 26 楼 bree06 的回复:
 public static void main(String[] args) {
        char[] cs = new Topics_392076826().serialize("11111111111111111111111111111111", "22", "88888888");
    }

    public static final int
            CHUNK_ID = 1001, CHUNK_VER = 0000, GUID_LEN = 32, PN_LEN = 2, SN_LEN = 8
            , CHUNK_SIZE = GUID_LEN + PN_LEN + SN_LEN;

    char[] serialize(String guid, String pn, String sn) {
        char[] pBuf = new char[64];
        int index = 0;

        //chunk head
        int chunk_size = CHUNK_SIZE;
        int chunk_id = CHUNK_ID;
        int chunk_ver = CHUNK_VER;

        char[] cs = intToChar(chunk_size);
        System.arraycopy(cs, 0, pBuf, index, cs.length);
        index += 4;

        cs = intToChar(chunk_id);
        System.arraycopy(cs, 0, pBuf, index, cs.length);
        index += 2;

        cs = intToChar(chunk_ver);
        System.arraycopy(cs, 0, pBuf, index, cs.length);
        index += 2;

        int temp_index = index;


        System.arraycopy(guid.toCharArray(), 0, pBuf, index, GUID_LEN);
        index += GUID_LEN;

        System.arraycopy(pn.toCharArray(), 0, pBuf, index, PN_LEN);
        index += PN_LEN;

        System.arraycopy(sn.toCharArray(), 0, pBuf, index, SN_LEN);
        index += SN_LEN;

        // chunk crc
        int crc = get_CRC(new String(pBuf, temp_index, index), CHUNK_SIZE);
        System.out.println(crc);
        cs = intToChar(crc);
        System.out.println((int)cs[0]);
        System.out.println((int)cs[1]);
        System.arraycopy(cs, 0, pBuf, index, cs.length);

        index += 4; // c++ sizeof(int) is 4

        return Arrays.copyOfRange(pBuf, 0, index);
    }

    char[] intToChar(int i) {
        if (i <= 0xff) {
            return new char[]{(char)i};
        }
        char[] cs = new char[2];
        cs[1] = (char) (i / (1 << 8));
        cs[0] = (char) (i - cs[1] * (1 << 8));
        return cs;
    }


    int get_CRC(String pBuf, int len) {
        int crc = 0;
        char[] cs = pBuf.toCharArray();
        for (int i = 0; i < cs.length; i++) {
            cs[i] &= 0xff;
        }
        int j = 0;
        while (len-- > 0) {
            for (int i = 0x80; i != 0; i = i >> 1) {
                if ((crc & 0x8000) != 0) {
                    crc = crc << 1;
                    crc = crc ^ 0x1021;
                } else {
                    crc = crc << 1;
                }
                if ((cs[j] & i) != 0) {
                    crc = crc ^ 0x1021;
                }
            }
            j++;
        }
        return crc;
    }
非常非常感谢!对我非常有用! 不过C++对我来说还是不打习惯(到处用指针,动不动就操作内存),心好累。。。 我会参考你给的这两个方法转换剩下的文件的!(感觉茫茫无尽头啊。。。) all in all,谢谢你!
bree06 2017-01-13
  • 打赏
  • 举报
回复
 public static void main(String[] args) {
        char[] cs = new Topics_392076826().serialize("11111111111111111111111111111111", "22", "88888888");
    }

    public static final int
            CHUNK_ID = 1001, CHUNK_VER = 0000, GUID_LEN = 32, PN_LEN = 2, SN_LEN = 8
            , CHUNK_SIZE = GUID_LEN + PN_LEN + SN_LEN;

    char[] serialize(String guid, String pn, String sn) {
        char[] pBuf = new char[64];
        int index = 0;

        //chunk head
        int chunk_size = CHUNK_SIZE;
        int chunk_id = CHUNK_ID;
        int chunk_ver = CHUNK_VER;

        char[] cs = intToChar(chunk_size);
        System.arraycopy(cs, 0, pBuf, index, cs.length);
        index += 4;

        cs = intToChar(chunk_id);
        System.arraycopy(cs, 0, pBuf, index, cs.length);
        index += 2;

        cs = intToChar(chunk_ver);
        System.arraycopy(cs, 0, pBuf, index, cs.length);
        index += 2;

        int temp_index = index;


        System.arraycopy(guid.toCharArray(), 0, pBuf, index, GUID_LEN);
        index += GUID_LEN;

        System.arraycopy(pn.toCharArray(), 0, pBuf, index, PN_LEN);
        index += PN_LEN;

        System.arraycopy(sn.toCharArray(), 0, pBuf, index, SN_LEN);
        index += SN_LEN;

        // chunk crc
        int crc = get_CRC(new String(pBuf, temp_index, index), CHUNK_SIZE);
        System.out.println(crc);
        cs = intToChar(crc);
        System.out.println((int)cs[0]);
        System.out.println((int)cs[1]);
        System.arraycopy(cs, 0, pBuf, index, cs.length);

        index += 4; // c++ sizeof(int) is 4

        return Arrays.copyOfRange(pBuf, 0, index);
    }

    char[] intToChar(int i) {
        if (i <= 0xff) {
            return new char[]{(char)i};
        }
        char[] cs = new char[2];
        cs[1] = (char) (i / (1 << 8));
        cs[0] = (char) (i - cs[1] * (1 << 8));
        return cs;
    }


    int get_CRC(String pBuf, int len) {
        int crc = 0;
        char[] cs = pBuf.toCharArray();
        for (int i = 0; i < cs.length; i++) {
            cs[i] &= 0xff;
        }
        int j = 0;
        while (len-- > 0) {
            for (int i = 0x80; i != 0; i = i >> 1) {
                if ((crc & 0x8000) != 0) {
                    crc = crc << 1;
                    crc = crc ^ 0x1021;
                } else {
                    crc = crc << 1;
                }
                if ((cs[j] & i) != 0) {
                    crc = crc ^ 0x1021;
                }
            }
            j++;
        }
        return crc;
    }
Jo123mn 2017-01-13
  • 打赏
  • 举报
回复
引用 2 楼 bree06 的回复:
long get_CRC(String pBuf, int len) {
    //TODO: implement crc
    int crc = 0;
    char[] cs = pBuf.toCharArray();
    for (int i = 0; i < cs.length; i++) {
        cs[i] &= 0xff;
    }
    int j = 0;
    while (len-- > 0) {
        for (int i = 0x80; i != 0; i = i >> 1) {
            if ((crc & 0x8000) != 0) {
                crc = crc << 1;
                crc = crc ^ 0x1021;
            } else {
                crc = crc << 1;
            }
            if ((cs[j] & i) != 0) {
                crc = crc ^ 0x1021;
            }
        }
        j++;
    }
    return crc;
}
数组越界啦
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
	at crc.get_CRC(Main.java:19)
	at crc.main(Main.java:30)
Jo123mn 2017-01-13
  • 打赏
  • 举报
回复
引用 22 楼 ipqtjmqj 的回复:
授人以鱼不如以渔。 你自己写吧。 有什么具体的细节不懂,就敲代码实验,或者网上查。 实在查不到再问
等等!好像都错了,这个len不是指那个字符数组的长度,我看了源代码,这个方法调用的地方是:
int crc = Utility::get_CRC(pBufDataStart, CHUNK_SIZE);
CHUNK_SIZE这个值的定义是:
const uint16_t GUID_LEN = 32;
	const uint16_t PN_LEN = 2;
	const uint16_t SN_LEN = 8;
	const uint32_t CHUNK_SIZE = GUID_LEN + PN_LEN + SN_LEN;
那么是不是这个CHUNK_SIZE 就是42? 如此运行代码的时候,都报错数组越界啦啦:
Jo123mn 2017-01-13
  • 打赏
  • 举报
回复
引用 22 楼 ipqtjmqj 的回复:
授人以鱼不如以渔。 你自己写吧。 有什么具体的细节不懂,就敲代码实验,或者网上查。 实在查不到再问
那我试试吧。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。不负大神好意
ipqtjmqj 2017-01-13
  • 打赏
  • 举报
回复
授人以鱼不如以渔。 你自己写吧。 有什么具体的细节不懂,就敲代码实验,或者网上查。 实在查不到再问
Jo123mn 2017-01-13
  • 打赏
  • 举报
回复
引用 17 楼 ipqtjmqj 的回复:
[quote=引用 16 楼 u014185468 的回复:] [quote=引用 14 楼 ipqtjmqj 的回复:] 在线运行用的都是UTF-8 java: http://ideone.com/xxbW6h c++: http://ideone.com/DUVq7G
但是我把你和他的代码都运行了,为啥得到是不一样的结果。。。[/quote] 一切以你给的c++代码为准,我的java代码与c++的结果一致[/quote] - -!你说的对!!!我想岔了!!是应该以C++源码为标准! 那能不能请你再帮我看看这个方法啊
int JasDevID::serialize(uint8_t * pBuf )
{

	//chunk head
	uint32_t chunk_size	= CHUNK_SIZE;
	uint16_t chunk_id	= CHUNK_ID;
	uint16_t chunk_ver = CHUNK_VER;

	memcpy(pBuf,&chunk_size,4);
	pBuf+=4;

	memcpy(pBuf,&chunk_id,2);
	pBuf+=2;

	memcpy(pBuf,&chunk_ver,2);
	pBuf+=2;

	// chunk data
	uint8_t * pBufDataStart = pBuf;

	memcpy(pBuf,guid,GUID_LEN);
	pBuf+=GUID_LEN;

	memcpy(pBuf,pn,PN_LEN);
	pBuf+=PN_LEN;

	memcpy(pBuf,sn,SN_LEN);
	pBuf+=SN_LEN;

	// chunk crc
	int crc = Utility::get_CRC(pBufDataStart, CHUNK_SIZE);
	memcpy(pBuf,&crc,sizeof(int));

	return 0;

}
这个函数用到的变量的定会为: public: const uint16_t CHUNK_ID = 1001; const uint16_t CHUNK_VER = 0000; const uint16_t GUID_LEN = 32; const uint16_t PN_LEN = 2; const uint16_t SN_LEN = 8; const uint32_t CHUNK_SIZE = GUID_LEN + PN_LEN + SN_LEN; public: char guid[GUID_LEN+1]; char pn[PN_LEN+1]; char sn[SN_LEN+1];
ipqtjmqj 2017-01-13
  • 打赏
  • 举报
回复
引用 19 楼 u014185468 的回复:
[quote=引用 18 楼 ipqtjmqj 的回复:] [quote=引用 16 楼 u014185468 的回复:] [quote=引用 14 楼 ipqtjmqj 的回复:] 在线运行用的都是UTF-8 java: http://ideone.com/xxbW6h c++: http://ideone.com/DUVq7G
但是我把你和他的代码都运行了,为啥得到是不一样的结果。。。[/quote] 你所说“他的代码”,是几楼的代码[/quote] 3楼,bree06 这个代码:
long get_CRC(String pBuf, int len) {
    //TODO: implement crc
    int crc = 0;
    char[] cs = pBuf.toCharArray();
    for (int i = 0; i < cs.length; i++) {
        cs[i] &= 0xff;
    }
    int j = 0;
    while (len-- > 0) {
        for (int i = 0x80; i != 0; i = i >> 1) {
            if ((crc & 0x8000) != 0) {
                crc = crc << 1;
                crc = crc ^ 0x1021;
            } else {
                crc = crc << 1;
            }
            if ((cs[j] & i) != 0) {
                crc = crc ^ 0x1021;
            }
        }
        j++;
    }
    return crc;
}
不好意思啊,我其实连移位都不大会,一般写webapp比较多。。。[/quote] 代码错在这里cs[i] &= 0xff; 汉字在Java中用UTF-16LE表示,两个字节,上面的写法把高字节删掉了
Jo123mn 2017-01-13
  • 打赏
  • 举报
回复
引用 18 楼 ipqtjmqj 的回复:
[quote=引用 16 楼 u014185468 的回复:] [quote=引用 14 楼 ipqtjmqj 的回复:] 在线运行用的都是UTF-8 java: http://ideone.com/xxbW6h c++: http://ideone.com/DUVq7G
但是我把你和他的代码都运行了,为啥得到是不一样的结果。。。[/quote] 你所说“他的代码”,是几楼的代码[/quote] 3楼,bree06 这个代码:
long get_CRC(String pBuf, int len) {
    //TODO: implement crc
    int crc = 0;
    char[] cs = pBuf.toCharArray();
    for (int i = 0; i < cs.length; i++) {
        cs[i] &= 0xff;
    }
    int j = 0;
    while (len-- > 0) {
        for (int i = 0x80; i != 0; i = i >> 1) {
            if ((crc & 0x8000) != 0) {
                crc = crc << 1;
                crc = crc ^ 0x1021;
            } else {
                crc = crc << 1;
            }
            if ((cs[j] & i) != 0) {
                crc = crc ^ 0x1021;
            }
        }
        j++;
    }
    return crc;
}
不好意思啊,我其实连移位都不大会,一般写webapp比较多。。。
ipqtjmqj 2017-01-13
  • 打赏
  • 举报
回复
引用 16 楼 u014185468 的回复:
[quote=引用 14 楼 ipqtjmqj 的回复:] 在线运行用的都是UTF-8 java: http://ideone.com/xxbW6h c++: http://ideone.com/DUVq7G
但是我把你和他的代码都运行了,为啥得到是不一样的结果。。。[/quote] 你所说“他的代码”,是几楼的代码
加载更多回复(7)

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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