MotoAgent 内置 36 专业助手 — 微信 QQ 里 @助手 就能获得专业解答

之前我们聊过 MotoAgent 支持多个微信同时登录、多员工多 Agent 切换。今天要说的功能,个人觉得是日常使用中最方便的一个——内置 36 个专业助手,在微信、QQ 里直接 @助手 就能获得专业解答,不用切换应用、不用打开网页。

一、36 个内置助手,覆盖常见场景

MotoAgent 的后台,有一个”职位模板管理”模块,里面内置了 36 个专业助手模板。每个助手都有自己独立的角色设定和工作方式,覆盖了日常工作和生活中最常见的场景。

从上图可以看到,每个助手模板包含两部分:

  • AGENTS.md — 定义助手的工作方式
  • SOUL.md — 定义助手的性格习惯

比如图中展示的:

  • HR 顾问 — 负责员工关系、规章制度、请假考勤等 HR 相关问题
  • 产品顾问 — 负责产品功能介绍、需求澄清、竞品对比等问题

类似的助手还有:法律顾问、财务顾问、技术顾问、翻译助手、文案写作、数据分析师……共 36 个,基本上日常遇到的各种问题都能找到对应的专业助手。

二、微信 QQ 里 @助手 就行,方便快捷

这些助手最大的特点就是——直接在微信或 QQ 里使用

张三正在微信里跟 MotoAgent 对话,突然想问个 HR 相关的问题,怎么办呢?

看上面的微信聊天截图,张三先问了一句”你好,你是谁呢”,AI 回答了”我是张三,你的专属智能助手”。然后张三直接发了一条消息:@HR 你擅长什么

AI 立刻以【HR 顾问】的身份回应,列出了自己的能力范围:

  • 解答公司规章制度相关问题
  • 说明请假、考勤、离职等流程
  • 解释员工福利政策
  • 以温暖、清晰的方式提供建议

整个过程就在微信聊天界面里完成,不用打开其他 App,不用切换到其他窗口。想找哪个助手,直接 @ 它的名字就行。

三、36 个助手,总有一个适合你

目前 MotoAgent 内置的 36 个助手覆盖了这些领域:

  • 人事行政 — HR 顾问、招聘助手、入职指引
  • 技术支持 — 技术顾问、代码审查、运维助手
  • 内容创作 — 文案写作、翻译助手、排版助手
  • 数据分析 — 数据分析师、报表助手、图表制作
  • 法律服务 — 法律顾问、合同审查、合规助手
  • 产品运营 — 产品顾问、运营助手、用户调研
  • 财务管理 — 财务顾问、报销助手、预算分析

每个助手都有独立的角色设定、专业知识和沟通风格,确保给出的回答专业且贴合场景。

四、为什么 @助手 这种方式好用

可能有人会问,那为什么不直接跟 AI 说”帮我写个 HR 相关的回答”呢?

有几个原因:

  1. 角色明确 — @HR 顾问,AI 就知道要以 HR 的身份和专业角度来回答,不会跑偏
  2. 知识专业 — 每个助手有自己的知识库和专业设定,回答更准确
  3. 即时切换 — 刚才在聊天,@HR 顾问立刻切到 HR 模式,再 @技术顾问 又切到技术模式,无缝切换
  4. 简单直观 — 不需要学习怎么用,就跟在群里 @某人一样自然

总结

MotoAgent 的 36 个内置助手,把专业能力直接送到了你日常使用的聊天工具里。想找谁帮忙,@ 一下就行:

  1. 36 个专业助手 — HR、技术、法律、财务…覆盖常见场景
  2. 微信 QQ 直接使用 — 不需要额外 App,聊天界面里 @ 就搞定
  3. 切换零成本 — 不用退出不用切换,@不同助手即时切换角色

如果你想在日常聊天中随时获得专业解答,不妨去 motoagent.net 看看。

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

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

MotoAgent 多员工多 AI Agent 同时在线 — 每人用不同的 AI,互不干扰

家里好几口人,每个人用 AI 的习惯不一样。张三喜欢用 Hermes 写代码、做视频处理,李四更习惯 OpenClaw 的轻便快捷,王五想用 Claude 做深度分析——能不能一家人各自用自己喜欢的 AI Agent,互不干扰?

今天继续聊 MotoAgent 的一个非常实用的功能:多员工管理 + 多 AI Agent 同时在线。每个家庭成员可以作为一个独立员工,各自绑定不同的 AI Agent,想切换随时切换,而且数据完全隔离。

一、每个员工独立配置 AI Agent

MotoAgent 里,每个家庭成员就是一个”员工”。管理员可以在后台为每个员工单独设置他使用的 AI Agent 类型。

上图是编辑员工 zhangsan 的界面,可以看到:

  • 后端类型 选择了 Hermes,说明这位员工使用 Hermes AI 助理
  • 绑定了渠道 weixin01
  • 简介设定为”我是张三”

再看另一位员工的配置:

这位员工的后端类型选择了 OpenClaw,绑定了 weixin002。同一个 motoagent.net 管理后台,不同员工可以各自绑定不同的 AI Agent,互不影响。

二、支持的 AI Agent 类型

目前 MotoAgent 支持多种 AI Agent 供员工选择:

  • Hermes — 功能全面,工具生态丰富,适合写代码、视频处理、数据分析等复杂任务
  • OpenClaw — 轻量高效,支持 Zero Token 免费使用各大模型,适合日常问答
  • Claude — 推理能力强,擅长长文本分析和深度思考
  • Codex — 编程能力突出,代码场景首选

每个员工独立选择,想用哪个用哪个。而且切换非常简单——管理员在员工编辑界面改一下”后端类型”下拉框就行,不需要重新安装、重新配置。

三、简单修改,随时切换

如果张三今天想用 Hermes 写代码,明天想换 OpenClaw 试试,管理员只需要:

  1. 进入员工管理
  2. 找到张三
  3. 修改”后端类型”下拉框
  4. 保存

整个过程不到 10 秒,不需要重新登录、不需要切换账号。切换后张三的数据、会话、配置完全保留,不会因为换了一个 AI Agent 就丢失之前的聊天记录。

四、大家相互独立,隐私有保障

每个员工的数据是完全隔离的:

  • 会话独立 — 张三的聊天历史李四看不到
  • 配置独立 — 每个人的 AI Agent、技能、渠道绑定都是分开的
  • 隐私保护 — 每个员工可以单独设置隐私规则

这就解决了家庭或小团队使用 AI 时最头疼的问题:不会因为共用账号而互相干扰,也不会因为切换 Agent 而丢失上下文。

总结

总的来说,MotoAgent 的多员工多 Agent 功能解决了三个问题:

  1. 多角色 — 每个家庭成员作为独立员工,各有各的身份和配置
  2. 多 Agent 同时在线 — Hermes、OpenClaw、Claude、Codex 自由选择,互不干扰
  3. 简单切换 — 改一下下拉框就行,不用重新安装配置

如果你想给家里每人配一个专属 AI 助理,或者团队需要不同角色使用不同 AI Agent,不妨去 motoagent.net 看看。

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

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

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