You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为VNC Server编写ZRLE编码时遭遇ZLib解压失败问题

ZLib压缩数据无法被VNC客户端解压问题

我正在以学术实践为目的,用Rust开发VNC Server,已完成RAW和Hextile编码的实现,搭建了ZLib与ZRLE相关模块。但服务器发送的ZLib压缩数据无法被任何VNC客户端解压,报错码-3(提示:invalid stored block lengths)。我已经查阅LibVNCServer、UltraVNC等开源VNC Server的源码,代码逻辑及调用的API基本一致,但问题仍未解决。实现过程中参考了RFB Protocol Documentation,相关代码如下:

use std::{mem, ptr};

#[derive(Debug)]
pub struct ZlibPixelData {
    pub pixel_data_len: u32,
    pub pixel_data: Vec<u8>
}

pub fn deflate(pixel_data: Vec<u8>) -> ZlibPixelData {
    let max_compressed = pixel_data.len() + ((pixel_data.len() + 99) / 100) + 12;
    let mut next_in: Vec<u8> = pixel_data.clone();
    let mut next_out: Vec<u8> = vec![0; max_compressed];

    unsafe {
        /* Define z_stream struct */
        let mut zlib_stream = libz_sys::z_stream {
            next_in: next_in.as_mut_ptr(),
            avail_in: next_in.len() as u32,
            total_in: 0,
            next_out: next_out.as_mut_ptr(),
            avail_out: max_compressed as u32,
            total_out: 0,
            msg: ptr::null::<u8>() as _,
            state: ptr::null::<u8>() as _,
            zalloc: mem::transmute(ptr::null::<u8>()),
            zfree: mem::transmute(ptr::null::<u8>()),
            opaque: ptr::null::<u8>() as _,
            data_type: libz_sys::Z_BINARY,
            adler: 0,
            reserved: 0,
        };
        
        /* Call deflateInit2_ */
        let deflate_init_status = libz_sys::deflateInit2_(
            &mut zlib_stream,
            6, /* Set Compress Level 6 (0-9, None-Max) */
            libz_sys::Z_DEFLATED,
            15, /* Range: 8-15 (Min-Max Memory) */
            8,
            libz_sys::Z_DEFAULT_STRATEGY,
            libz_sys::zlibVersion(),
            mem::size_of::<libz_sys::z_stream>() as i32,
        );

        if deflate_init_status != libz_sys::Z_OK {
            println!("ZLIB: DeflateInit2_() failed. Status: {}", deflate_init_status);
            return ZlibPixelData { 
                pixel_data_len: pixel_data.len() as u32, 
                pixel_data
            };
        }

        let deflate_status = libz_sys::deflate(
            &mut zlib_stream,
            libz_sys::Z_FULL_FLUSH
        );

        if deflate_status != libz_sys::Z_OK {
            println!("ZLIB: Deflate() failed. Status: {}", deflate_status);
            return ZlibPixelData { 
                pixel_data_len: pixel_data.len() as u32, 
                pixel_data
            };
        }

        println!("ZLIB: Compressed: {} bits to {} bits", zlib_stream.total_in, zlib_stream.total_out);
        ZlibPixelData { 
            pixel_data_len: zlib_stream.total_out as u32, 
            pixel_data: (&next_out[..zlib_stream.total_out as usize]).to_vec()
        }
    }
}

pub fn get_pixel_data(pixel_data: Vec<u8>) -> ZlibPixelData {
    deflate(pixel_data)
}

Remmina调试模式

内容的提问来源于stack exchange,提问作者Atheesh Thirumalairajan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 09:08:22