Có bất kỳ thư viện/mã nào trong Java để tính CRC 32 bit của luồng byte theo cách phù hợp với lệnh cksum trong unix không?Chức năng cksum tương thích Java
Trả lời
Jacksum: http://www.jonelo.de/java/jacksum/index.html
cksum algorithm: POSIX 1003.2 CRC algorithm
length: 32 bits
type: crc
since: Jacksum 1.0.0
comment: - under BeOS it is /bin/cksum
- under FreeBSD it is /usr/bin/cksum
- under HP-UX it is /usr/bin/cksum and
/usr/bin/sum -p
- under IBM AIX it is /usr/bin/cksum
- under Linux it is /usr/bin/cksum
Đó là mã nguồn mở.
Bạn đã thử lớp CRC32 chưa?
http://download.oracle.com/javase/7/docs/api/java/util/zip/CRC32.html
Đây là crc 32 sử dụng gzip.
Tôi đọc trực tuyến tại một số nơi mà thuật toán crc-32 của unix cksum không giống với thuật toán của gzip. Tôi đã không thử nghiệm điều này, nhưng nó có thể là sự thật. Sử dụng 'Jacksum' (xem ở trên) hoạt động tốt cho tôi. – Kowshik
@Kowshik, tôi có thể xác minh rằng CRC32 của Java KHÔNG giống như/usr/bin/cksum –
@Kowshik, hãy kiểm tra câu trả lời của tôi. –
Tuyên bố của Carlos Rendon, "Tôi có thể xác minh rằng CRC32 của Java KHÔNG giống như/usr/bin/cksum", không chính xác.
Như Peter Lawrey đã đề cập, bạn có thể sử dụng CRC32 của Java trực tiếp để có cùng kiểm tra như Unix/Linux cksum
.
Cách đúng để làm điều đó là:
java.util.zip.CRC32 x = new java.util.zip.CRC32();
x.update(bytes);
StdOut.println("CRC32 (via Java's library) = " + Long.toHexString(x.getValue()));
Nguồn: http://introcs.cs.princeton.edu/java/61data/CRC32.java.html
CRC mặc định sử dụng dựa trên các đa thức sử dụng cho lỗi CRC kiểm tra tại các mạng tiêu chuẩn ISO/IEC 8802-3: 1989.
Nó chắc chắn trả về kết quả khác nhau cho tôi. Trong thực tế, máy tính của tôi (một máy Mac) có cả '/ usr/bin/cksum' và'/usr/bin/crc32'. 'cksum <(echo -n hello)' sản lượng '3287646509', trong khi' crc32 <(echo -n hello) 'sản lượng' 3610a686', và tôi cũng kiểm tra xem 'CRC32' của Java trả về cùng giá trị với dòng lệnh ' crc32' và KHÔNG có cùng giá trị với dòng lệnh 'cksum'. –
Cũng trên máy Mac này, 'cksum -o 3 <(echo -n hello)' sản lượng '907060870' tương tự như '3610a686'. Vì vậy, 'cksum -o 3' không khớp với' CRC32' của Java. Nhưng đó không phải là thuật toán mặc định cho '/ usr/bin/cksum' trên máy này. –
Thuật toán mặc định không phải là 32 bit. Đọc trang người đàn ông cksum để biết thêm chi tiết –
Hoạt động hoàn toàn tốt cho tôi. Cảm ơn đã phản ứng nhanh chóng! – Kowshik
@palacsint: Có mã/bản ngã mà tôi có thể sử dụng trong chương trình java của mình không, vì tôi không muốn bất kỳ tiện ích nào của bên thứ ba – abi1964
Thực tế thú vị, jonelo.jacksum.algorithm.Cksum có cùng giao diện với lớp CRC32 của Java nhưng cho cùng một kết quả là unix cksum. –