Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaCRC32:与C中的CRC不同#_Java_Crc - Fatal编程技术网

JavaCRC32:与C中的CRC不同#

JavaCRC32:与C中的CRC不同#,java,crc,Java,Crc,我必须将文件与java与C#脚本提供的CRC32代码进行比较。当我用java.util.zip.CRC32计算CRC32时,结果完全不同 我猜C#脚本的polynom=0x2033与zip.CRC32中使用的不同。可以设置多项式吗?或者有没有java类的想法来计算一个CRC32,在这里您可以定义自己的多项式 更新:问题不是polymnom。这在C#和Java之间是一样的 这是我的代码,也许我读取文件的方式有问题 package com.mine.digits.internal.contentup

我必须将文件与java与C#脚本提供的CRC32代码进行比较。当我用java.util.zip.CRC32计算CRC32时,结果完全不同

我猜C#脚本的polynom=0x2033与zip.CRC32中使用的不同。可以设置多项式吗?或者有没有java类的想法来计算一个CRC32,在这里您可以定义自己的多项式

更新:问题不是polymnom。这在C#和Java之间是一样的

这是我的代码,也许我读取文件的方式有问题

package com.mine.digits.internal.contentupdater;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.CRC32;

public class CRC 
{
    public static String doConvert32(File file)
    {
        byte[] bytes = readBytesFromFile(file); // readFromFile(file).getBytes();

        CRC32 x = new CRC32();
        x.update(bytes);

        return (Long.toHexString(x.getValue())).toUpperCase();
    }

    /** Read the contents of the given file. */
    private static byte[] readBytesFromFile(File file)
    {
        try
        {
            InputStream is = new FileInputStream(file);

            long length = file.length(); 
            if (length > Integer.MAX_VALUE) { 
                // File is too large 
            } 

            byte[] bytes = new byte[(int)length]; 
            int offset = 0; 
            int numRead = 0; 
            while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0)
            { 
                offset += numRead; 
            } 

            // Ensure all the bytes have been read in 
            if (offset < bytes.length) { 
                System.out.println("Could not completely read file " + file.getName()); 
            } 

            // Close the input stream and return bytes 
            is.close(); 

            return bytes;
        }
        catch (IOException e)
        {
            System.out.println("IOException " + file.getName()); 

            return null;
        }
    }
}
包com.mine.digits.internal.contentupdater;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.util.zip.CRC32;
公共级轨道交通
{
公共静态字符串doConvert32(文件)
{
byte[]bytes=readBytesFromFile(file);//readFromFile(file).getBytes();
CRC32 x=新的CRC32();
x、 更新(字节);
return(Long.toHexString(x.getValue()).toUpperCase();
}
/**读取给定文件的内容*/
私有静态字节[]readBytesFromFile(文件文件)
{
尝试
{
InputStream is=新文件InputStream(文件);
long length=file.length();
如果(长度>整数.MAX_值){
//文件太大
} 
字节[]字节=新字节[(int)长度];
整数偏移=0;
int numRead=0;
而(偏移量=0)
{ 
偏移量+=numRead;
} 
//确保已读入所有字节
if(偏移量<字节长度){
System.out.println(“无法完全读取文件”+file.getName());
} 
//关闭输入流并返回字节
is.close();
返回字节;
}
捕获(IOE异常)
{
System.out.println(“IOException”+file.getName());
返回null;
}
}
}
非常感谢, Frank

标准(IEEE)CRC32多项式为0x04C11DB7,对应于:

x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 +
x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1
这就是java.util.zip.CRC32所使用的。我不知道你提到的C#脚本

您可以发现此代码段非常有用:


CRC-32是根据IEEE 802.3的一种特定CRC变体,使用多项式0x04C11DB7。如果您的C#库使用的是多项式0x2033,那么它/不是/是CRC-32的实现


如果你需要Java代码来计算任意的CRC变量,谷歌搜索“Java CRC”会给你几个例子。

通过从C#复制代码并将其转换为Java类来解决


因此,现在两者都使用相同的代码,只需对无符号有符号字节的差异做一些小的更改。

1+x+x^2+x^4+x^5+x^7+x^8+x^10+x^11+x^12+x^16+x^22+x^23+x^26 (0x04C11DB7)
Java使用上述多项式进行CRC 32计算,与IEEE 802.3标准不同,IEEE 802.3标准的32位幂为x。

备选方案是:a)您没有正确使用Java、C#或两者的API;b) 您使用的C#代码有缺陷。如果看不到你的代码或你正在使用的C代码,很难说。一对包含少量测试数据的简短但完整的程序会很有帮助。仅供参考:您的Java代码看起来不错,也许C方面有问题?好吧,我进一步研究了一下,发现C实际上使用的是0x04C11DB7,所以Java类也是如此。问题一定是在其他地方,为什么我的crc在C#和JAVA上不一样……对于crc,endiannes也很重要。CRC不处理字节;相反,它们对比特流进行操作。因此,如果字节内的位排序或字内的字节排序有问题,则不会得到相同的结果。@Schedler:大多数CRC算法实现一次只处理一个字节,因此不应该存在字节排序问题。如果有的话,那就是实现中的一个bug。x^32部分被悄悄添加。