Files
markbase/rust-iscsi-initiator/src/crc32c.rs
Warren 1300a4e223
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
MarkBase架构升级:Multi-Volume Virtual Tree + Dual-View Management + Git Remote修正
核心功能:
-  Categories/Series双视图管理(category_view.rs + import_markdown.rs)
-  FUSE Multi-Volume支持(tree_type参数)
-  SSH/SFTP/SCP/rsync协议完整实现(4042行)
-  NFS/SMB Module Phase 1-3完成
-  Archive Module Phase 1-4完成(2916行)
-  Download Center API完整实现
-  S3兼容API实现(560行)

Git配置修正:
-  删除错误origin(gitea.momentry.ddns.net)
-  删除m5max128(指向机器名)
-  设置origin = m5max128gitea.momentry.ddns.net/admin/markbase
-  设置m4minigitea = m4minigitea.momentry.ddns.net/warren/markbase

数据清理:
-  删除38个临时SQLite(保留accusys.sqlite、demo.sqlite)
-  删除.bak、test_*.bin、调试脚本等临时文件
-  删除临时目录(build/、download files/、raid_test/等)
-  更新.gitignore排除临时文件

架构优化:
- 52个文件修改,2434行新增,4739行删除
- Workspace成员整合(16个crate)
- 数据库状态:accusys.sqlite保留(主demo测试)

远程同步:
-  准备推送到m5max128gitea(远程Gitea)
-  准备推送到m4minigitea(本地Gitea)
2026-06-12 12:59:54 +08:00

109 lines
2.4 KiB
Rust

use crc32c::crc32c_append;
/// CRC32C checksum implementation for iSCSI
pub struct Crc32c {
value: u32,
}
impl Crc32c {
/// Create new CRC32C calculator
pub fn new() -> Self {
Self { value: 0 }
}
/// Initialize with existing value
pub fn with_value(value: u32) -> Self {
Self { value }
}
/// Append data to CRC calculation
pub fn append(&mut self, data: &[u8]) {
self.value = crc32c_append(self.value, data);
}
/// Get final CRC value
pub fn finalize(&self) -> u32 {
self.value
}
/// Calculate CRC32C for entire buffer
pub fn calculate(data: &[u8]) -> u32 {
crc32c::crc32c(data)
}
/// Verify CRC32C checksum
pub fn verify(data: &[u8], expected: u32) -> bool {
Self::calculate(data) == expected
}
/// Convert to 4-byte array (little-endian)
pub fn to_bytes(&self) -> [u8; 4] {
self.value.to_le_bytes()
}
/// Convert to 4-byte array (big-endian, iSCSI standard)
pub fn to_bytes_be(&self) -> [u8; 4] {
self.value.to_be_bytes()
}
/// Parse from 4-byte array (big-endian)
pub fn from_bytes_be(bytes: [u8; 4]) -> Self {
Self {
value: u32::from_be_bytes(bytes),
}
}
}
impl Default for Crc32c {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_crc32c_basic() {
let data = b"Hello, World!";
let crc = Crc32c::calculate(data);
// Should match known CRC32C value
assert!(crc != 0);
}
#[test]
fn test_crc32c_append() {
let mut crc = Crc32c::new();
crc.append(b"Hello");
crc.append(b"World");
let final_crc = crc.finalize();
let direct_crc = Crc32c::calculate(b"HelloWorld");
assert_eq!(final_crc, direct_crc);
}
#[test]
fn test_crc32c_verify() {
let data = b"test data";
let crc = Crc32c::calculate(data);
assert!(Crc32c::verify(data, crc));
assert!(!Crc32c::verify(data, crc + 1));
}
#[test]
fn test_crc32c_bytes() {
let crc = Crc32c::with_value(0x12345678);
let bytes_be = crc.to_bytes_be();
assert_eq!(bytes_be, [0x12, 0x34, 0x56, 0x78]);
let parsed = Crc32c::from_bytes_be(bytes_be);
assert_eq!(parsed.value, 0x12345678);
}
}