UUencode

uuencode是将二进制文件转换为文本文件的过程,转换后的文件可以通过纯文本e-mail进行传输,在接收方对该文件进行uudecode,即将其转换为初始的二进制文件。   

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%的.

流程如下:


其转换源码如下:

//header
#pragma once
#define ENCODE_BYTE(b) (((b) == 0) ? 0x60 : ((b) + 0x20)) 
#define DECODE_BYTE(b) ((b == 0x60) ? 0 : b - 0x20)

void Byte3ToAsc4(unsigned char inbyte[3],unsigned char outAsc[4]);
void Asc4ToByte3(unsigned char inAsc[4],unsigned char outByte[3]);

//body
#include "StdAfx.h"
#include "UUencode.h"
//encode
void Byte3ToAsc4(unsigned char inbyte[3],unsigned char outAsc[4])
{
	outAsc [0] = ENCODE_BYTE ((inbyte [0] & 0xFC) >> 2);
	outAsc [1] = ENCODE_BYTE (((inbyte [0] & 0x03) << 4) + ((inbyte [1] & 0xF0) >> 4));
	outAsc [2] = ENCODE_BYTE (((inbyte [1] & 0x0F) << 2) + ((inbyte [2] & 0xC0) >> 6));
	outAsc [3] = ENCODE_BYTE (inbyte [2] & 0x3F);
}
//decode
void Asc4ToByte3(unsigned char inAsc[4],unsigned char outByte[3])
{
	outByte [0] = DECODE_BYTE (inAsc [0]); 
	outByte [1] = DECODE_BYTE (inAsc [1]);
	outByte [0] <<= 2;
	outByte [0] |= (outByte [1] >> 4) & 0x03;
	outByte [1] <<= 4;
	outByte [2] = DECODE_BYTE (inAsc [2]);
	outByte [1] |= (outByte [2] >> 2) & 0x0F;
	outByte [2] <<= 6;
	outByte [2] |= DECODE_BYTE (inAsc [3]) & 0x3F;
}



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值