我正在使用" RAW"进行RFB服务器的简单实现。像素编码。我使用TightVNC作为我的桌面客户端。我让代码工作到客户端能够请求整个"桌面"这是640x480像素。我的测试图案在形状方面正确绘制,但颜色错误。
我尝试每像素使用8位:每个字节中有三个红色,三个绿色和两个蓝色编码为RRRGGGBB
。
我的ServerInit数据包包含此像素编码规范...
//all of these 13 fields are unsigned chars...
si.pf.bits_per_pixel = 8;
si.pf.depth = 8;
si.pf.big_endian_flag = 0;
si.pf.true_colour_flag = 1;
si.pf.red_max_hi = 0;
si.pf.red_max_lo = 7; // 3 bits
si.pf.green_max_hi = 0;
si.pf.green_max_lo = 7; // 3 bits
si.pf.blue_max_hi = 0;
si.pf.blue_max_lo = 3; // 2 bits
si.pf.red_shift = 5; // >>>>>RRR
si.pf.green_shift = 2; // >>RRRGGG
si.pf.blue_shift = 0; // RRRGGGBB
//remaining fields are omitted
因此定义了整个结构:
typedef struct
{
uchar bits_per_pixel;
uchar depth;
uchar big_endian_flag;
uchar true_colour_flag;
uchar red_max_hi;
uchar red_max_lo;
uchar green_max_hi;
uchar green_max_lo;
uchar blue_max_hi;
uchar blue_max_lo;
uchar red_shift;
uchar green_shift;
uchar blue_shift;
uchar padding0;
uchar padding1;
uchar padding2;
}tPixelFormat;
现在,如果我用0xe0
(二进制111 000 00
)填充我的桌面图像,那么我希望将其解释为纯红色。但它看起来像浅蓝色(好像8个单独的位被向后解释!)。我的测试图案的形状是正确的,因为我在顶角绘制了一些白色像素(白色显然是二进制111 111 11
)。
我不明白这一点。我相信我已遵循RFB规范中描述的算法和编码... http://vncdotool.readthedocs.org/en/latest/rfbproto.html#serverinit
我做错了什么?
答案 0 :(得分:1)
Wireshark救援!解决了它。
事实证明,客户端发送了一个我没有看到的SetPixelFormat
请求,代码忽略了它,显然服务器被要求通过更改输出格式来满足请求。
修复方法是通过硬编码客户端要求的值,简单地向客户端提供它想要的内容。此时客户端再也不会再发送该请求,因为它对服务器从一开始就放弃的内容感到满意。