MotoAgent 多个微信同时登录 — 独立隔离、家庭多人用互相不干扰,人人都能用上 AI

一、多个微信同时在线,各自独立

用过 AI 工具的朋友都知道,大部分 AI 工具都是一个账号一人用。家里人多一点,要么轮流排队用,要么互相看到对方的聊天记录,体验很不好。

MotoAgent 不一样,它支持添加多个微信实例,每个实例独立运行、互不干扰。

添加微信实例

上图是添加微信的界面,填写实例名称,生成二维码用微信扫码即可完成绑定。可以添加 weixin01、weixin002 等多个实例,每个实例对应一个真实的微信账号。

多个微信同时在线

看这张渠道管理界面,weixin01weixin002 两个微信实例都已显示「已连接」状态。左边是全部渠道列表,可以看到除了微信,还支持 Telegram、WhatsApp、飞书、QQ、企业微信等多种渠道。每个渠道实例都可以单独配置隐私规则、访问口令,还能绑定到特定的员工。

也就是说,张三的手机绑 weixin01,李四的手机绑 weixin002,两个人各自用自己微信跟 AI 对话,各自的数据完全隔离,谁也看不到谁的聊天记录。

二、不同家庭成员,不一样的体验

Web 端使用

这是 motoagent.net 的对话工作区界面,可以看到 Hermes Agent 正在回复用户的问题:
“我是 Hermes Agent,一个智能 AI 助手,由 Nous Research 创建。你也可以叫我张三,在系统里我设定为你的得力帮手~”

说明每个家庭成员可以拥有自己独立的 AI 设定和聊天历史。

手机端微信直接使用

张三在手机微信里直接跟 ClawBot 对话,AI 正在处理中。不需要打开网页、不需要额外 App,就在日常用的微信里直接使用 AI 能力。这对家里不太会用电脑的长辈来说特别方便。

再看看李四的微信——同样是 ClawBot,但李四看到的是自己的 AI 助手「李四」,跟张三的 AI 设定完全不同。两个人各自用自己的微信号,各自跟 AI 聊天,数据完全隔离,互不干扰。

三、不止微信,QQ、企业微信、飞书都支持

除了微信,MotoAgent 还支持以下平台的多账号登录:

  • QQ — 多个 QQ 号同时在线,各自独立使用
  • 企业微信 — 适合公司团队,不同员工用不同账号接入
  • 飞书 — 企业协作场景,支持多账号并行
  • Telegram — 国际用户也能用
  • WhatsApp — 海外联系人沟通

每个平台都可以添加多个实例,就像微信一样。不管是个人家庭使用,还是小团队协同,都能找到合适的方式。

四、为什么需要多账号隔离

可能有人会问,一个 AI 账号大家共用不行吗?其实有几个问题:

  1. 隐私问题 — 共用账号所有人都能看到聊天记录,张三查的资料李四全看到了,不合适
  2. 干扰问题 — 一个人正在跟 AI 对话,另一个人发消息过来,上下文全乱了
  3. 个性化问题 — 每个人的 AI 使用习惯不同,有人要写代码的风格,有人要翻译的风格,混在一起 AI 都不知道该怎么回答

MotoAgent 的多账号隔离正好解决了这些问题,每个账号拥有独立的会话空间、历史记录和 AI 配置,真正做到了家庭多人各用各的。

总结

总的来说,MotoAgent 在多账号管理方面解决了三个实际痛点:

  1. 多个微信同时登录 — 张三绑 weixin01,李四绑 weixin002,各自独立运行
  2. 跨平台支持 — QQ、企业微信、飞书同样支持多账号,不局限于微信
  3. 数据完全隔离 — 各人聊天记录、配置互不可见,隐私有保障

如果你家里有好几口人都想用 AI,或者团队需要多人同时接入,不妨去 motoagent.net 看看,也许正是你需要的。

好了,今天就聊到这里,有什么问题欢迎交流!

Posted in 其它 | Tagged , , , , , , , , , | Leave a comment

MotoAgent — 家庭 AI 管家,多人多平台多 Agent 随心切换,人人都能用上 AI

你不能预知明天,但你可以利用今天。 你不能样样顺利,但你可以事事尽力!

最近一直在研究各种 AI Agent 工具,从 OpenClaw 到 Codex 再到 Claude Code,每个都有自己的特色。但是问题也来了——家里好几口人,每个人都想用,每个人的微信号、QQ号都不一样,用的 Agent 也不一样,这该怎么管理?

直到接触到了 MotoAgent,发现它正好解决了这些痛点。它是一个开源的 AI 家庭网关平台,把自己常用的 AI 能力整合到一个地方,一家人各用各的。今天就跟大家聊聊它的几个实用特性。

一、全家一起用,相互不干扰

用过 AI 工具的朋友应该都有体会,大多 AI 工具都是一个账号一个人用。家里人多了,要么共用账号互相干扰,要么每人开一个账号费用高。

MotoAgent 在这方面做得不错——支持多人同时使用,而且每个成员之间数据完全隔离。

什么意思呢?比如家里的张三和李四都在用,张三在问”今年高考数学怎么样”,李四在问”帮我写个 Python 脚本”,两个人的对话、历史、配置完全是独立的,互不看到对方的内容。

从界面可以看到,MotoAgent 有一个完整的员工管理体系,可以添加多个家庭成员作为独立用户,每个用户有自己的会话空间和任务列表。这就解决了家庭共享 AI 时最头疼的隐私和干扰问题。

二、微信 QQ 都能绑,想用什么用什么

这个可以说是最实用的功能了。

现在的 AI 工具大多数都只支持 Web 端或自己的 App,但 MotoAgent 不一样——它支持直接绑定各种外部消息平台,把 AI 能力直接送到你日常使用的聊天工具里。

目前支持的平台包括:

  • 微信 — 直接在微信里跟 AI 对话,不用打开网页
  • QQ — 适合在 QQ 群里使用
  • 钉钉 — 办公场景很方便
  • 飞书 — 企业协作场景
  • Telegram — 玩国际版的朋友可以用
  • WhatsApp — 适合海外联系

而且是多人各自绑定自己的账号。张三绑自己的微信,李四绑自己的 QQ,互不影响。每个人在自己熟悉的聊天工具里就能直接使用 AI 能力,不需要切换到特定 App。

平台集中管理也做得很好,所有渠道的状态、权限、隐私规则都可以在 motoagent.net 的管理页面统一配置,省心很多。

三、多个 Agent 随意切换

用过 AI 工具的朋友都知道,不同 Agent 各有千秋:

  • OpenClaw — 支持 Zero Token 免费使用各大模型,灵活性高
  • Hermes — 功能全面,工具生态丰富,适合复杂任务
  • Codex — 编程能力很强,代码场景首选
  • Claude — 推理能力出色,长文本分析表现好

以前换一个 Agent 要退一个应用再开另一个,非常麻烦。MotoAgent 把这个问题解决了——同一界面内,Agent 任意切换。

看上面这张图,左侧切换到 OpenClaw 会话,右侧可以切换到 Hermes 会话,随时切换不用退出。模型也从 DeepSeek 到 Claude 都可以灵活配置。对于需要同时使用多个 AI 模型的用户来说,这种无缝切换的体验非常方便。

上图是 Hermes Agent 的工作界面,可以看到它正在处理一个视频自动处理的复杂任务,支持多轮对话和联网搜索。整个交互界面清晰直观,会话历史、任务管理都在左侧面板一目了然。无论是编程、写作还是数据分析,都能在一个界面里完成。

总结

总的来说,MotoAgent 解决了三个很实际的问题:

1. 家里人多 — 多人独立账户,数据隔离互不干扰,适合家庭共享 2. 平台多 — 微信、QQ、钉钉、飞书,想绑哪个绑哪个,AI 能力随手可用 3. Agent 多 — OpenClaw、Hermes、Codex、Claude,同界面任意切换,想用哪个用哪个

如果你也在找一款能全家共享、多平台接入、多 Agent 自由切换的 AI 助手,不妨去 motoagent.net 看看。

好了,今天就先聊到这里,希望对大家有帮助。有什么问题欢迎交流!

Posted in ai | Tagged , , , , , , , , , , | Leave a comment

http 接口调试在线工具 24log dump http request raw

很久没有写东西了,一直要开始,一直没有动手,在线工具24mail推出有尽8个年头了,chacuo.net工具更新很少,期间经常收到一些朋友询问与咨询,对站点一些工具给与肯定,本身作为码农的我,线上很多工具都是来自于工作需求,想想码农的我需要使用,大家肯定也需要的。

啰嗦了,今天介绍一款 最新工具 24log.chacuo.net 在线dump http request raw工具。先说说使用场景把, chrome 自带的强大http 请求调试抓包,想必大家经常使用,但是作为移动端,接口开发,app开发,我们也经常会接触到 api 请求,以为接口进行编码,加密,对接时候经常出问题。有时候我们想知道,自己发送服务端接口原始数据是什么,因此我们需要dump出 自己request 请求,一番调试,修改代码,很是好烦时间,有没有一款工具,能够在线查看到我日志,以及 服务端返回的内容呢,24log.chacuo.net 就可以解决这个问题。该工具有2个功能,我们看看第一个常用功能。

24log.chacuo.net/my ,它是一个开放接口,所有用户都可以调用,我们访问一下试试看

image

直接打印出,我请求该地址 , request 请求, 通过该地址,以下2个方面很方便:

1、测试 浏览器 发送 请求 header 头,只需要 通过该浏览器,访问 24log.chacuo.net/my 地址即可,看到请求参数, user-agent

2、公共地址 支持常见的’OPTIONS’, ‘GET’, ‘HEAD’, ‘POST’, ‘PUT’, ‘DELETE’, ‘TRACE’ 协议,我们看看给发一个 formdata 表单请求

curl ’24log.chacuo.net/my’  -F ‘test=测试一下’ -F ‘who=我是谁’

 

POST /my HTTP/1.1
Host: 24log.chacuo.net
Connection: Keep-Alive
Content-Length: 252
Accept-Encoding: gzip
User-Agent: curl/7.29.0
Accept: */*
Content-Type: multipart/form-data; boundary=—————————-7169b4ab667a

——————————7169b4ab667a
Content-Disposition: form-data; name=”test”

测试一下
——————————7169b4ab667a
Content-Disposition: form-data; name=”who”

我是谁
——————————7169b4ab667a–

将formdata  request  raw 完整格式打印出来了

接下来我们说说自定义24log 地址

自定义url地址,跟公共地址相比,可以设置 目标地址,如: 发送数据给24log 地址 =》日志镜像 =》 请求真是目标地址

1、生成地址  http://24log.chacuo.net/

image

2、设置转发地址

image

访问 http://24log.chacuo.net/dump/5f4d0fb87e74f => https://www.baidu.com 了,我们试试看

3、访问试试看

image

已经读取到 baidu 代码,我们接下来看看 镜像到访问日志了

4、查看 访问日志

image

点击进去查看

5、查看详细内容

image

可以查看到 完整请求头,返回内容,可以直接下载 源码以及,浏览

 

该工具演示完了,怎么样还是一头雾水? 不妨亲自去试试看 24log.chacuo.net   使用后,估计很快就知道怎么用了.  这里只是演示get请求,其实的’OPTIONS’, ‘GET’, ‘HEAD’, ‘POST’, ‘PUT’, ‘DELETE’, ‘TRACE’ 都支持的,不妨试试! 大家对工具有什么疑问,欢迎邮件建议!

 

 

 

 

作者:程默的博客  QQ:8292669
原文网址:http://blog.chacuo.net/1436.html
订阅保持关注:http://blog.chacuo.net/feed
本文版权归作者所有,欢迎转载,请务必添加原文链接。

Posted in 其它 | Leave a comment

web应用安全 简介

一晃有一年多没有写博客了,每次想提笔写写,由于总是感觉要写的太多了,总是对自己说:“想清楚想明白再写”,这样就一直拖延。 另外一个原因是,觉得也没有什么人看,就这样耽搁下来了。 人是个有惰性的物种,只要惰性战胜了自己,就会找到很多理由让自己偷懒下。好了,闲话少说了,言归正传了。

 

做了多年的web开发,遇到过很多刚刚毕业的兄弟以及刚入行的朋友。 经常在做一些功能时候,从技术设计本身出现各种问题。 他们在程序语言方面非常熟悉,但是做出来经常出现重大安全隐患!主要是用代码实现需求时候,考虑不全面,因此存在各种设计缺陷,产生技术漏洞!一些书本只会教我们 怎么样去实现功能, 而不会说 怎么样完美、无bug实现。这也是我 想写 应用安全的原因! 希望给所有做web开发朋友,一些借鉴,写出更完美的程序!

上一段简单代码吧,限制只有某个a.com 来源站点,可以访问一个页面,我们代码一般如下:

<?php
//读取reffer
$reffer = isset($_SERVER["HTTP_REFFER"])?$_SERVER["HTTP_REFFER"]:'';

if(strpos($reffer,"a.com")===false)
{
    exit('禁止访问!');
}

////继续执行

以上代码,大家应该在一些demo里面,还有书本上面都有看到过,并且也会这样写的。 据说,weixin分享地址时候,也通过这种方式来检查是不是它们的域名呢。

问题出在那里呢?

一个 url 地址格式是: 协议://user:pass@host/path?query#hash  ,可以看到 如果只是简单检测uri 里面是否有a.com ,是不是太容易被绕过了? 只要自己地址是http://b.com#a.com  ,是不是一样可以访问我们资源了?

 

哈哈, 是不是回想起自己某时候也这么写过呢!吐舌笑脸  ,希望这个例子能够激发您的兴趣,我们除了能实现逻辑,好的程序员,应该要做到安全稳定、实现高性能程序! 当然,我们接下来主要讲的是怎么安全实现常见web应用功能。

接下来章节,我就以做一个 简单网页 ‘留言薄’来说吧!  “啊? 为什么是 做留言薄呢”, 其实一个留言板里面功能,也能涉及到我们方方面面了,麻雀虽小、五脏俱全啦! 另外, 记忆最深刻的的,我第一次学习web程序时候,也是从留言薄开始的呢!

 

待续……,先跟朋友们说晚安了!

Posted in web安全 | Tagged | Leave a comment

网站备案突然取消了(8天不能访问)

非常奇怪,网站没有做其它什么操作。突然10.3日开始就不能访问,由于国庆期间,一直在老家,操作站点不便。回深后,联系空间商,确定是备案被取消了, 网站不能访问了。 没有办法,独立主机上面的http协议被限制了请求。

现在临时将空间通过香港转发,感谢fubinhoo 帮助。今天先做端口转发,然后再做反向代理。终于从香港vps 上面转发过来了。 目前新的备案还在申请中,转发可能会出现不稳定情况。望朋友们多多包涵,任何问题,欢迎Q我!

 

谢谢大家!

 

Posted in 其它 | 4 Comments

XXencode 编码,XX编码介绍、XXencode编码转换原理、算法

Xxencode编码,也是一个二进制字符转换为普通打印字符方法。跟UUencode编码原理方法很相似,唯独不同的是可打印字符不同。通个UUencode编码,我们知道它有个缺点就是,64个可打印字符中,有很多的特殊字符。而XXencode编码方法,对64个原字符有做规范。这里它有跟Base64类型了。都有指定可打印字符范围、及编号。Xxencode编码在上世纪后期,IBM大型机中得到很广泛的应用。现在逐渐被Base64编码转换方法所取代了。

Xxencode编码原理

XXencode将输入文本以每三个字节为单位进行编码。如果最后剩下的资料少于三个字节,不够的部份用零补齐。这三个字节共有24个Bit,以6bit为单位分为4个组,每个组以十进制来表示所出现的数值只会落在0到63之间。以所对应值的位置字符代替。它所选择的可打印字符是:+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz,一共64个字符。跟base64打印字符相比,就是uuencode多一个“-” 字符,少一个”/” 字符。 但是,它里面字符顺序与Base64完全不一样。与UUencode比较,这里面所选择字符,都是常见字符,没有特殊字符。这也决定它当年流行使用原因!

每60个编码输出(相当于45个输入字节)将输出为独立的一行,每行的开头会加上长度字符,除了最后一行之外,长度字符都应该是“h”这个字符(45,刚好是64字符中,第45位’h’字符),最后一行的长度字符为剩下的字节数目 在64字符中位置所代表字符。

问题:uuencode编码转换为xxencode编码怎么样操作?

从2中编码原理来看,几乎一样。就是所用的64个字符不一样。一次,简单对uuencode转换后字符,逐位(处理’`’字符)减去32,然后得到一个值。这个值在xxencode 64字符中所对应位置字符替换即可。

XXencode编码转换过程

    
原始字符 C a t
原始ASCII码(十进制) 67 97 116
ASCII码(二进制) 0 1 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 1 1 1 0 1 0 0
新的十进制数值 16 54 5 52
编码后的XXencode字符 Eq3 O
字符串:'Cat‘ 编码后是:Eq3O
XXencode编码PHP实现过程
/**
 *xxencode编码*
 *@author 程默
 *@copyright http://blog.chacuo.net/
 *@param string $src 待处理字符串
 *@return string encode编码完字符串
 */
function c_xx_encode($src)
{
	//64个可打印字符
	static $base="+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    ///每次读取3个字节
    $lbyte = 3;
    ////将原始的3个字节转换为4个字节
    $slen=strlen($src);
    $smod = ($slen%$lbyte);
    $snum = floor($slen/$lbyte);
 
 
    $desc = array();
     
    //将剩下字节以0字节补齐
    $src = $smod===0?$src:$src.str_repeat("\0",$lbyte-$smod);
    $snum = $smod===0?$snum:$snum+1;
 
    for($i=0;$i<$snum;$i++)
    {
        ////读取3个字节
        $_arr = array_map('ord',str_split(substr($src,$i*$lbyte,$lbyte)));
 
        ///计算每一个6位值
        $_dec = array();
        $_dec[]=$_arr[0]>>2;
        $_dec[]=(($_arr[0]&3)<<4)|($_arr[1]>>4);
        $_dec[]=(($_arr[1]&0xF)<<2)|($_arr[2]>>6);
        $_dec[]=$_arr[2]&63;
         
        ///求每一位值,在64字符中所对应的字符
        foreach ($_dec as &$v)
        {
           $v=$base[$v];
        }
        $desc = array_merge($desc,$_dec);
    }
     

    //每60个编码输出(相当于45个输入字节)将输出为独立的一行,每行的开头会加上长度字符,除了最后一行之外,长度字符都应该是'h'这个ASCII字符(45),最后一行的长度字符为剩下的字节数目,在64字符中对应字符。
    $abyte = 60;
    $crlf = "\r\n";
    $alen = count($desc);
    $anum = floor($alen/$abyte);
    $amod = ($alen%$abyte);
     
    $adesc = array();
     
    for ($i=0;$i<$anum;$i++)
    {
        $adesc[]='h'.implode('',array_slice($desc,$i*$abyte,$abyte)).$crlf;
    }
     
    ///截取后面剩余数组长度
    if($amod!==0)
    {
        ///以下计算不满45字节编码情况
        $adesc[]=$base[$amod/4*$lbyte+($smod?$smod-$lbyte:$smod)].implode('',array_slice($desc,-$amod)).$crlf;
    }
     
    return implode('',$adesc);  
}

以上代码从uuencode编码做简单修改而来,基本上去掉+32一些地方。知道编码原理,其实我们很容易实现uuencode->xxencode转换的

xxencode编码

xxencode编码

以上转换后结果,与专业转换工具一致的。好了,通过学习这类用可打印字符表示二进制字节的编码方法。我们可以发现很多有趣东西!对应以后我们如果做自己的编码转换,可以给我们很多借鉴!欢迎朋友们给出自己的意见!

Posted in web原理 | Tagged , | Leave a comment

UUencode 编码,UU编码介绍、UUencode编码转换原理、算法

UUencode编码起先用在unix网络中,先是Unix系统下将二进制的资料借由uucp邮件系统传输的一个编码程式,也是一种二进制到文字的编码。不属于MIME编码中一员。它也是定义了用可打印字符表示二进制文字一种方法,并不是一种新的编码集合。主要解决,二进制字符在传输、存储中问题。它早期在电子邮件中使用较多,最近这些年来基本上被MIME 中Base64所取代了。E-mail中一般采用UU、MIME、BINHEX三种编码标准! 我想,了解下这种编码将二进制字符转换为可打印字符实现思路!对我们以后做类似处理工作,应该会有很多的启示。

UUencode编码过程

Uuencode将输入资料以每三个字节为单位进行编码,如此重复进行。如果最后剩下的资料少于三个字节,不够的部份用零补齐。这三个字节共有24个Bit,以6-bit为单位分为4个群组,每个群组以十进制来表示所出现的数值只会落在0到63之间。将每个数加上32,所产生的结果刚好落在ASCII字符集中可打印字符(32-空白…95-底线)的范围之中。每60个编码输出(相当于45个输入字节)将输出为独立的一行,每行的开头会加上长度字符,除了最后一行之外,长度字符都应该是’M'这个ASCII字符(77=32+45),最后一行的长度字符为32+剩下的字节数目这个ASCII字符。如果是一个 0字节那它应该被转换为0×60而不是0×20,因为(前引用’`')优于 0×20(空格’ ‘)。

特点一:看到特点了吧,也是64字符,也是一组6位。怎么,怎么,跟我们的base64这么相似呢?是的,从这个定义中,我们确实发现它跟base64比起来很相似了。

特点二:它定义64字符,不用写映射表,是通过加32转换到可打印字符范围中。比起base64,更为简单!

思考问题:它的字符范围都是可打印字符,我们会发现64字符集合中,有很多是特殊字符:”!”#¥%&‘()*+=’” 等等。这些字符在不同应用中,可能都有些特殊用途。因此,在使用该编码时候,或许会出现一些问题。我想这也许是UUencode编码方法,逐渐被Base64所取代的原因吧。

UUencode 64字符集
可打印字符十进制ASCII值uuencode
二进制表示
uuencode
十进制表示
 可打印字符十进制ASCII值uuencode
二进制表示
uuencode
十进制表示
(space)32000 0000 @64100 00032
!33000 0011 A65100 00133
"34000 0102 B66100 01034
#35000 0113 C67100 01135
$36000 1004 D68100 10036
%37000 1015 E69100 10137
&38000 1106 F70100 11038
'39000 1117 G71100 11139
(40001 0008 H72101 00040
)41001 0019 I73101 00141
*42001 01010 J74101 01042
+43001 01111 K75101 01143
,44001 10012 L76101 10044
-45001 10113 M77101 10145
.46001 11014 N78101 11046
/47001 11115 O79101 11147
048010 00016 P80110 00048
149010 00117 Q81110 00149
250010 01018 R82110 01050
351010 01119 S83110 01151
452010 10020 T84110 10052
553010 10121 U85110 10153
654010 11022 V86110 11054
755010 11123 W87110 11155
856011 00024 X88111 00056
957011 00125 Y89111 00157
:58011 01026 Z90111 01058
;59011 01127 [91111 01159
<60011 10028 \92111 10060
=61011 10129 ]93111 10161
>62011 11030 ^94111 11062
?63011 11131 _95111 11163
     `96(1) 000 00064

UUencode编码转换过程

原始字符Cat
原始ASCII码(十进制)6797116
ASCII码(二进制)010000110110000101110100
新的十进制数值1654552
+3248863784
编码后的Uuencode字符0V%T
字符串:'Cat‘ 编码后是:oV%T

UUencode PHP实现过程

编码转换过程,与Base64类似!下面代码是实现过程,我们可以看看转换方法!

/**
 *uuencode编码*
 *@author 程默
 *@copyright http://blog.chacuo.net/
 *@param string $src 待处理字符串
 *@return string encode编码完字符串
 */
function c_uu_encode($src)
{
	///每次读取3个字节
	$lbyte = 3;
	////将原始的3个字节转换为4个字节
	$slen=strlen($src);
	$smod = ($slen%$lbyte);
	$snum = floor($slen/$lbyte);


	$desc = array();
	
	//将剩下字节以0字节补齐
	$src = $smod===0?$src:$src.str_repeat("\0",$lbyte-$smod);
	$snum = $smod===0?$snum:$snum+1;

	for($i=0;$i<$snum;$i++)
	{
		////读取3个字节
		$_arr = array_map('ord',str_split(substr($src,$i*$lbyte,$lbyte)));

		///计算每一个6位值
		$_dec = array();
		$_dec[]=$_arr[0]>>2;
		$_dec[]=(($_arr[0]&3)<<4)|($_arr[1]>>4);
		$_dec[]=(($_arr[1]&0xF)<<2)|($_arr[2]>>6);
		$_dec[]=$_arr[2]&63;
		
		///对每个6位值加上32,读取ascii码 如果6位值是0,以字符"`"代替
		foreach ($_dec as &$v)
		{
			$v = $v===0?'`':chr($v+32);
		}
		$desc = array_merge($desc,$_dec);
	}
	//return implode('',$desc);
	
	///以上代码只是进行转换,没有进一步进行
	//每60个编码输出(相当于45个输入字节)将输出为独立的一行,每行的开头会加上长度字符,除了最后一行之外,长度字符都应该是'M'这个ASCII字符(77=32+45),最后一行的长度字符为32+剩下的字节数目这个ASCII字符。
	$abyte = 60;
	$crlf = "\r\n";
	$alen = count($desc);
	$anum = floor($alen/$abyte);
	$amod = ($alen%$abyte);
	
	$adesc = array();
	
	for ($i=0;$i<$anum;$i++)
	{
		$adesc[]='M'.implode('',array_slice($desc,$i*$abyte,$abyte)).$crlf;
	}
	
	///截取后面剩余数组长度
	if($amod!==0)
	{
		///以下计算不满45字节编码情况
		$adesc[]=chr($amod/4*3+32+($smod?$smod-$lbyte:$smod)).implode('',array_slice($desc,-$amod)).$crlf;
	}
	
	return implode('',$adesc);	
}

 

以上只是按照转换过程,通过PHP代码实现方法!目前PHP没有UUencode转换模块!

UUencode编码

UUencode编码

该代码转换结果,跟使用工具转换结果一致。我查看了线上一些转换方法,很多结果不一致!最好,大家使用在线工具转换前,做一下比较!没有做过验证的代码,可能会给你带来麻烦!欢迎分享你的方法!

Posted in web原理 | Tagged , | Leave a comment

Base64 编码介绍、Base64编码转换原理、算法

Base64编码,是我们程序开发中经常使用到的编码方法。它是一种基于用64个可打印字符来表示二进制数据的表示方法。它通常用作存储、传输一些二进制数据编码方法!也是MIME(多用途互联网邮件扩展,主要用作电子邮件标准)中一种可打印字符表示二进制数据的常见编码方法!它其实只是定义用可打印字符传输内容一种方法,并不会产生新的字符集!有时候,我们学习转换的思路后,我们其实也可以结合自己的实际需要,构造一些自己接口定义编码方式。好了,我们一起看看,它的转换思路吧!

Base64实现转换原理

它是用64个可打印字符表示二进制所有数据方法。由于2的6次方等于64,所以可以用每6个位元为一个单元,对应某个可打印字符。我们知道三个字节有24个位元,就可以刚好对应于4个Base64单元,即3个字节需要用4个Base64的可打印字符来表示。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9 ,这样共有62个字符,此外两个可打印符号在不同的系统中一般有所不同。但是,我们经常所说的Base64另外2个字符是:“+/”。这64个字符,所对应表如下。

编号 字符   编号 字符   编号 字符   编号 字符
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /

Base64编码转换算法、转换原理

转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。

如果最后剩下两个输入数据,在编码结果后加1个“=”;如果最后剩下一个输入数据,编码结果后加2个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。

编码后的数据比原始数据略长,为原来的4/3。无论什么样的字符都会全部被编码,因此不像Quoted-printable 编码,还保留部分可打印字符。所以,它的可读性不如Quoted-printable 编码!

文本 M a n
ASCII编码 77 97 110
二进制位 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0
索引 19 22 5 46
Base64编码 T W F u

M的Ascii码是77,前六位对应值为19,对应base64字符是T,如此类推。其它字符编码就可以自动转换得到!我们看看另外不是刚好是3个字节的情况!

 

文本(1 Byte) A    
二进制位 0 1 0 0 0 0 0 1                                
二进制位(补0) 0 1 0 0 0 0 0 1 0 0 0 0                        
Base64编码 Q Q = =
文本(2 Byte) B C  
二进制位 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1     x x x x x x
二进制位(补0) 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 x x x x x x
Base64编码 Q k M  =

Base64转换代码实现

既然知道了方法,那么我们如果要自己写个简单转换,好像也是很容易的!下面,我写下我做转换php代码!

 

/**
 *base64编码方法、本方法只是做base64转换过程代码举例说明,通过该例子可以任意改造不同语言版
 *@author 程默
 *@copyright http://blog.chacuo.net
 *@param $src 原字符串
 *@return string base64字符串*
 */
function c_base64_encode($src)
{
	static $base="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	
	////将原始的3个字节转换为4个字节
	$slen=strlen($src);
	$smod = ($slen%3);
	$snum = floor($slen/3);
	
	
	$desc = array();
	
	for($i=0;$i<$snum;$i++)
	{
		////读取3个字节
		$_arr = array_map('ord',str_split(substr($src,$i*3,3)));
		
		///计算每一个base64值
		$_dec0= $_arr[0]>>2;
		$_dec1= (($_arr[0]&3)<<4)|($_arr[1]>>4);
		$_dec2= (($_arr[1]&0xF)<<2)|($_arr[2]>>6);	
		$_dec3= $_arr[2]&63;

		$desc = array_merge($desc,array($base[$_dec0],$base[$_dec1],$base[$_dec2],$base[$_dec3]));
	}
	
	if($smod==0) return implode('',$desc);
	
	///计算非3倍数字节
	$_arr = array_map('ord',str_split(substr($src,$snum*3,3)));
	$_dec0= $_arr[0]>>2;
	///只有一个字节
	if(!isset($_arr[1]))
	{
		$_dec1= (($_arr[0]&3)<<4);
		$_dec2=$_dec3="=";
	}
	else 
	{
		///2个字节
		$_dec1= (($_arr[0]&3)<<4)|($_arr[1]>>4);
		$_dec2= $base[($_arr[1]&7)<<2];
		$_dec3="=";
	}
	$desc = array_merge($desc,array($base[$_dec0],$base[$_dec1],$_dec2,$_dec3));
	return implode('',$desc);
}
base64编码转换原理 

好了,通过这个例子,我想base64编码转换原理、算法有些了解了吧!它转换过程很简单,只需要做个映射表,然后将原先做一些移位运算就可以完成!我们通过该例子,是不是可以做个自己的base32这类的编码呢!欢迎朋友们交流!

Posted in web原理 | Tagged , | Leave a comment

Quoted-printable 编码介绍、编码解码转换

Quoted-printable 可译为“可打印字符引用编码”、“使用可打印字符的编码”,我们收邮件,查看信件原始信息,经常会看到这种类型的编码!

Quoted-printable编码
最多时候,我们在邮件头里面能够看到这样的编码!Content-Transfer-Encoding:quoted-printable
 

它是多用途互联网邮件扩展(MIME) 一种实现方式。其中MIME是一个互联网标准,它扩展了电子邮件标准,致力于使其能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息。目前http协议中,很多采用MIME框架!quoted-printable 就是说用一些可打印常用字符,表示一个字节(8位)中所有非打印字符方法!

Quoted-printable编码方法

任何一个8位的字节值可编码为3个字符:一个等号”=”后跟随两个十六进制数字(0–9或A–F)表示该字节的数值.例如,ASCII码换页符(十进制值为12)可以表示为”=0C”, 等号”=”(十进制值为61)必须表示为”=3D”. 除了可打印ASCII字符与换行符以外,所有字符必须表示为这种格式.

所有可打印ASCII字符(十进制值的范围为33到126)可用ASCII字符编码来直接表示, 但是等号”=”(十进制值为61)不可以这样直接表示.ASCII的水平制表符(tab)与空格符, 十进制为9和32, 如果不出现在行尾则可以用其ASCII字符编码直接表示。如果这两个字符出现在行尾,必须QP编码表示为”=09″ (tab)或”=20″ (space).

如果数据中包含有意义的行结束标志,必须转换为ASCII回车(CR)换行(LF)序列,既不能用原来的ASCII字符也不能用QP编码的”=”转义字符序列。 相反,如果字节值13与10有其它的不是行结束的含义,它们必须QP编码为=0D与=0A.

quoted-printable编码的数据的每行长度不能超过76个字符. 为满足此要求又不改变被编码文本,在QP编码结果的每行末尾加上软换行(soft line break). 即在每行末尾加上一个”=”, 但并不会出现在解码得到的文本中.

例如:If you believe that truth=beauty, then surely mathematics is the most beautiful branch of philosophy. 编码后结果是

If you believe that truth=3Dbeauty, then surely=20=
mathematics is the most beautiful branch of philosophy.

编码里面,有几个特定限定,一些可打印字符不用编码,当然如果你按照规范编码后,也一样可以显示的!因此自己简单自己实现该编码:

function quoted_printable_encode($string) { 
    return preg_replace('/[^\r\n]{73}[^=\r\n]{2}/', "$0=\r\n", str_replace("%","=",
rawurlencode($string)));
}

一个函数就可以,将所有字符串urlencode转换后,%号替换为”=”号,然后对非\r\n超过73连续字符,后面加一个=\r\n。这个是简单实现方法! 按照该编码详细说明里面,有些空格、换行,还有一些特殊字符可以不用转换。不过一起转换了,也不会有影响!

很多时候,我们用些常见字符表示所有8位其它非打印字符,这种通过,Quoted-printable编码,只是对该字节转为16进制后,做简单增加前缀!然后做些特殊字符处理即可! 它的简单,及编码高效,也让该编码在邮件格式里面,得到了广泛使用!好了,就到这里,欢迎交流!

Posted in web原理 | Tagged , | Leave a comment

ISO-8859-1 、Latin-1 西欧编码介绍及应用

这些编码,早些时候在一些应用软件中经常看到,估计很多朋友也看到了,这些编码了!

iso-8859-1字符集应用 

从这个图,我们可以看到这类编码应用很广泛,那么我们一起看看,iso-8859-1字符集,到底是什么样字符集,有那些字符!为什么,它应用可以这么广泛!

计算机上面流行第一个字符集,是ascii码,是0-127 一个128字符。每个字符在里面有个对应编号,分别是0-127。如果用二进制表示,刚好是7位。这个字符集,在前期表示英文字符已经足够。后来,随着计算机普及,越来越多国家(欧洲),开始应用计算机,他们发现7位,共128字符。已经不能描述他们常用的字符了。因此想到要兼容ascii字符集,就指定了扩展ASCII字符集。最多是0-255,256个字符。其中0-127 128字符及位置编码 完全兼容ascii码。只是扩展了128-255位置编入了新字符!

iso-8859-1字符集 

该字符集,完全兼容ascii字符集,并且是刚好可以用一个字节表示里面所有字符位置。又称为扩展Ascii码!这也是第一个iso-8859-1字符集。又叫:Latin-1 编码(西欧编码),后来陆续出了iso-8859-2…-15字符集。都是完全兼容ascii码的。

 

说下几个概念吧,什么是字符集,什么是字符编码?

1、字符集,表示由一些指定的字符的所组成集合!ascii字符集,里面有128个字符

2、字符编码,每个字符集中字符,都有一个固定的编号,也叫该字符在字符集中的的编码!如:ascii字符集中,a 字符编码是97。

相同字符,会出现在多个字符集中吗,相同字符在不同字符集中编码一样吗?

从上面例子,我们可以看到,ascii字符集、iso-8859-1字符集 有128个字符相同的。经常相同的字符,可以出现在各个字符集中。但是,每个字符集对字符编号方式可能不同,因此,相同字符,在不同字符集中,编码结果可能不一样。当然,也有一样的!象ascii中所有字符编码,在iso-8859-1字符集中,都一样的。

 

弄清楚关于、字符集,字符编码概念。我们还有几个必须掌握的。就是,计算机是怎么样储存,显示字符的呢?

一个文件有很多符号组成,各式各样的!实际,计算机在存储时候,只是写入该字符所对应的字符编码值。将它存于磁盘或者在网络中传输!如果要显示时候,通过对应字符集中,字符编码值。然后可以转换到计算机 通用的字符集的对应字符编码。计算机每个字符形状,图像长相,都在字体中。然后,通过转换得到通用字符集的字符编码,找到对应的字符,及字体形状,然后显示出来!

字符存储方式 
字符在计算机存储、传输都是该字符所在字符集中编码值 
 

好了,中间我们对字符概念做了很多的阐述、说明!下面,我们继续本页主题iso-8859-1字符集了。 它为什么能够这么广泛应用呢?

我们知道,单字节最多可以表示256字符,实际上很多字符(目前unicode有几十万字符),都需要用多个字节来存储!计算机在存储传输都以字节为单位!因此单字节的: iso-8859-1 是存储的最小单元。所以,无论你是多少个字节组成的字符,以单字节一个一个存储、传输!都不会改变原来的值,都可以很好保存它的值!计算机乱码,出现在显示的时候,在不正确的字符集中,查找对应字符编码的字符!经常是,编码选择字符集,跟做显示选择字符集不一致造成的!

在复制文件、传输文件不会造成字符编码问题。而出现问题时候,是字符做显示,或者将显示字符存储的时候,会出现问题!好了,这里面说的是iso-8859-1 其实,更多的是说说,字符编码的一些常识!明白这些,对于iso-8859-1的一些特点理解,可能 更容易了!

可能以前有朋友就问,我mysql是存中文的,为什么我选择字符集是Latin-1 ,是不是就出现乱码了。其实不会,它只是将接到任何字节,按照单字节,逐个逐个存储的。然后,读取时候,也逐个逐个字节的读出。没有改变任何保存内容,也没有做任何编码转换!这是,最为安全的!好了,就到这里了,欢迎朋友们交流!

Posted in web原理 | Tagged , | Leave a comment