UU编码

UU编码是一种将3字节二进制数据转换为4字节可打印ASCII字符的方法,其效率高于Hex编码。文章详细介绍了UU编码的转换过程,并提供了C语言的编码和解码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UU编码算法将3字节二进制数据转换成4字节可打印的ASCII字符集。因为Hex格式是将1字节二进制数据转换成2字节ASCII数据,所以UU编码的效率高于Hex格式。

UU编码的编码
因为3字节二进制数据共24Bits,把它们按6Bits分成4份,这样就变成了4个字节,再把新生成的4个字节每个都加上0x20,若这样处理后的数值为0x20,则用0x60取代。用C语言表示的UU编码过程如下:
#define ENCODE_BYTE(b) (((b) == 0) ? 0x60 : ((b) + 0x20))
outbuf [0] = ENCODE_BYTE ((inbytep [0] & 0xFC) >> 2);
outbuf [1] = ENCODE_BYTE (((inbytep [0] & 0x03) << 4) +
((inbytep [1] & 0xF0) >> 4));
outbuf [2] = ENCODE_BYTE (((inbytep [1] & 0x0F) << 2) +
((inbytep [2] & 0xC0) >> 6));
outbuf [3] = ENCODE_BYTE (inbytep [2] & 0x3F);
若原数据字节数不是3的倍数,则以0x00填充。

 

uu 编码 (将3字节BIN数据转换成4字节可打印ASCII字符)(转自suncilang.21ic.org)
 
uu 编码
uuencode 编码方式用于将任意的二进制文件转换为文本文件,比如email.转换后的文件中仅包含可打印字符.
uuencode 运算法则将连续的 3字节编码转换成 4字节(8-bit 到 6-bit)的可打印字符. 该编码的效率高于Hex 格式.

从二进制文件中读取 3字节的数据, 表示如下(a7 表示 a字节的第 7位):
  a7a6a5a4a3a2a1a0 b7b6b5b4b3b2b1b0 c7c6c5c4c3c2c1c0
转换它们到4字节里为如下所示:
  0 0 a7a6a5a4a3a2 0 0 a1a0b7b6b5b4 0 0 b3b2b1b0c7c6 0 0 c5c4c3c2c1c0
然后, 每个字节再加 0x20转换为可打印的字符.
注意: 如果是一个 0字节那它应该被转换为0x60而不是0x20, 因为(前引用'`')优于 0x20(空格' ').

例如: 从文件中读取的 3字节如下:
        14       0F       A8
  00010100 00001111 10101000
转换为 6-bit:
  000101 000000 111110 101000
每字节高两位补 0后为:
  00000101 00000000 00111110 00101000
最后每字节再加 0x20,则 4字节输出应该为:
  25 60 5E 48
注意: 00字节被转换为 0x60而不是 0x20.

因此, 在一个 uuencoded文件中仅包含字符 0x21 '!'到 0x60 '`',它们都是可打印和可被 email传送的.
这个转换过程也意味着 uuencoded 文件要比原文件大 33%的.

===== 编码 =====
outbuf  [4] 输出 uu编码数据.
inbytep [3] 输入二进制数据.

#define ENCODE_BYTE(b) (((b) == 0) ? 0x60 : ((b) + 0x20))

    outbuf [0] = ENCODE_BYTE  ((inbytep [0] & 0xFC) >> 2);
    outbuf [1] = ENCODE_BYTE (((inbytep [0] & 0x03) << 4) +
                              ((inbytep [1] & 0xF0) >> 4));
    outbuf [2] = ENCODE_BYTE (((inbytep [1] & 0x0F) << 2) +
                              ((inbytep [2] & 0xC0) >> 6));
    outbuf [3] = ENCODE_BYTE   (inbytep [2] & 0x3F);

===== 解码 =====
linep [4]   输入 uu编码数据.
outbyte [3] 输出二进制数据.

#define DECODE_BYTE(b) ((b == 0x60) ? 0 : b - 0x20)

      outbyte [0] = DECODE_BYTE (linep [0]);
      outbyte [1] = DECODE_BYTE (linep [1]);
      outbyte [0] <<= 2;
      outbyte [0] |= (outbyte [1] >> 4) & 0x03;
      outbyte [1] <<= 4;
      outbyte [2] = DECODE_BYTE (linep [2]);
      outbyte [1] |= (outbyte [2] >> 2) & 0x0F;
      outbyte [2] <<= 6;
      outbyte [2] |= DECODE_BYTE (linep [3]) & 0x3F;

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/jeketl/archive/2005/12/18/555553.aspx

相关函数说明:http://www.uudama.com/process.html 源码页面:http://dll.uuwise.com/index.php?n=ApiDoc.Anjian 按键精灵插件: 新插件[2013.7.13]下载地址:http://com.uuwise.com/index.php?n=ApiDoc.DLLdownLoad <---推荐使用 经过不段改进程序源代码,最终实现了原生COM组件放到按键精灵目录下面就可以使用了,函数调用方法参考COM版函数说明,示例语句在下面 注:不需要regsvr32注册 旧插件: [2013.7.2]---按键精灵插件完全版--基于动态连接库版 [2013.7.2]---按键精灵插件精减版,仅【登录,上传图片,取结果,报错】四个函数--基于动态连接库版 调用示例语句: softID = 2116 //软件ID 软件和KEY在开发者后台获取 softKEY = "2000adff4e5c4c448f45944c643b2b10" //软件key userName = "优优用户帐户" //用户的用户名,非开发者帐号 passWord = "优优用户密码" //密码 zhuce = Plugin.UU.SetSoftInfo(softID, softKEY) //初始化软件(必须) login = Plugin.UU.Login(userName, passWord) //登录优优,仅需要调用一次(必须) If login > 0 Then getUserScore=Plugin.UU.getScore(userName,passWord) //查询用户当前积分(可选) MessageBox "登录成功,您的用户ID为:" & login & ",您的剩余题分为:" & getUserScore yzmID = Plugin.UU.upLoadFile("c:\1.jpg", 1) //调用识别函数,根据路径上传,参数中的1为图片类型ID(表示需要识别的图片为四位英文或数字) //yzmID = Plugin.UU.recognizeScreenByCodeType(7,165,25,15,1,0) //截图并上传函数 //请参考:http://dll.uuwise.com/index.php?n=ApiDoc.Price If yzmID > 0 Then MessageBox "已将您的图片上传至优优,请耐心等待识别结果!" yzm=Plugin.UU.getResult(yzmID) //根据验证码ID获取识别结果 MessageBox "图片的识别结果为:" & yzm & "该图片在服务器上的ID为:" & yzmID /* //如果图片识别不正确,调用 !如何判断识别不正确?用户登录网站的时候, //如果验证码识别不正确,网页会有相关提示,其它应用应该差不多。 //注意:恶意报错(打正确也报),会同时冻结您的开发者帐户及用户帐户。 reportStatus = Plugin.UU.reportError(yzmID) If reportStatus=0 Then MessageBox "恭喜您报错成功,题分已返还至您的用户帐户!" End If */ Else MessageBox "上传图片出现错误,错误代码为:" &yzmID //错误代码请参考:http://dll.uuwise.com上各对应函数 End If Else MessageBox "对不起,登录失败,错误代码为:" &login //错误代码请参考:http://dll.uuwise.com上各对应函数 End If
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值