区块链100讲:16进制数据的编码/解码算法

字符编码(十六进制) 假设一个简易的变长编码规则XUTF:每个字符有一个唯一编号值 unicodeVal(如汉字“华”的编号十进制值是21326),使用1~6个字节进行编码,编码规则如下:编码过程:参考编号值范围,根据 unicodeVal 值判断需要几个字节进行编码,然后依次把 unicodeVal 的二进制比特填充到二进制格式中的有效位上:右侧对齐、左侧补 0;注意:固定位不变。现给定某个字符的十进制编号值 unicodeVal,请按XUTF编码规则对该字符进行编码,输出编码后的十六进制字符串(大写)。 阅读详情

image

众所周知,计算机存储和处理的都是二进制数据。为了简洁,实际上使用最多的是二进制的一个变种–16进制。比如笔者的名字叫嘉文,中文拼音是jiawen(全小写),在计算机里存储的就是 6A696177656E。

很明显,人类容易记住jiawen,而其相应的16进制代码6A696177656E就很考验人的记忆力了。同样的,人类很难记住16进制的数据,但是如果是16进制编码的文本字符串就相对好记好读一些了。以下是一张ASCII码表的一部分。

image

十六进制的07是一个Bell(响铃),如果试着用计算机程序去打印,结果是不可见也不可理解的,只能听到一声铃声。但是文本字符串“07”则相对容易理解和记忆。上文提到过,Bitcoin地址都是16进制的数,不做转换,打印的话毫无意义,人类无法直观的辨识。

大家可以想象一下查询自己的银行账户余额的场景,假如账户里只有77块钱了,查询结果的打印是大写字符M(10进制的编码是77)。我相信大部分的用户都不知道那是77的意思。相对的,如果把数字77转换成文本“77”(其16进制编码是3737)后再打印,对于显示在屏幕上的文本77,用户就会理解了。总结一下:

image

下面的几节将讨论用文本来表示16进制数据的几种编码方式。

1、Base64

这是一种用64个字符来表示任意二进制数据的方法,通常exe、jpg、pdf等文件都是二进制文件,用文本编辑器打开都是乱码,那么就需要一个方法,可以将二进制编码成字符串的格式,这样可以将二进制文件用文本打开查看。

那么,既然是BASE64,就是通过64个字符来编码的,具体是哪64个字符呢?请见下表:

image

Base64编码主要用在传输、存储、表示二进制等领域,还可以用来加密,但是这种加密比较简单,只是一眼看上去不知道什么内容罢了,当然也可以对Base64的字符序列进行定制来进行加密,我们来看下Base64的编码过程。

首先,既然是使用上述64个字符的范围来表示的,那么,要能够表示出64个字符的各种组合,得起码用6个bit才行,根据排列组合,6个bit可以总共表示出2的6次方的组合的字符排列;针对一份需要转化的二进制文件,可以这样来处理,每3个字节一组,这样一共是24bit,然后可以针对这个24bit再来划分,划分成每6bit一组,这样一共可以分成4组,分成4组6bit后,则对照上表去查找对应的字符就可以了,这样就可以转换为base64了,简单吧。

那么,如果在3个字节一组划分的时候,如果不是3的倍数怎么办呢?这样就需要使用\x00字节在末尾补足,再在编码的末尾加上1个或2个=号,表示补了多少字节。

由于标准的Base64编码后可能出现字符+和/,在URL中就不能直接作为参数,所以又有一种”url safe”的base64编码,其实就是把字符+和/分别变成-和_。

根据这个原理,其实还是比较容易理解这种编码思想的,而且,也可以看出,这种编码是可以逆向的,以“yes”这个字符串为例,它的Base64编码是eWVz,大家可以自行尝试几个例子。

2、Base58

顾名思义,Base58是基于58个字母和数字组成的,有了Base64的基础,我们就比较容易理解Base58了,实际上就是Base64的一个子集,相对于Base64来说,Base58不包括以下Base64的字符:

  • 数字0

  • 大写字母O

  • 大写字母I

  • 小写字母l

  • +与/

可以看出,小写o和大写O很容易和数字0混淆,小写l和大写I很容易和数字1混淆,Base58就是Base64去除了几个看起来容易混淆的字符以及容易导致转义的/和+。Base58的编码表如下:

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

必须注意,不同的应用实现使用的编码表内容是一样的,但是顺序可能不一样,比如:

1)比特币地址:123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

2)Ripple 地址:rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz

接下来我们来了解一下Base58Check,比特币使用的是改进版的Base58算法,为了解决Base58编码的字符串没有完整性校验机制。在传播过程中,如果出现某些字符损坏或者遗漏,就没法检测出来了,所以使用了改进版的算法Base58Check,

3、 Base58Check

在二进制数据的传输过程中,为了防止数据传输的错误,保护数据安全,通常会加一个校验码。通过校验码的配合可以发现数据是否被破坏或者是否在发送时输入错误了。Base58Check就是Base58加上校验码,或者可以说是Base58的一种编码形式,在比特币系统中生成钱包地址的时候就使用到了这种编码形式。

我们知道,钱包地址是用来转账的,虽然Base58编码已经可以做到避免一些容易混淆的字符,但是还不能保证用户的误输入或者地址信息在传输过程中由于某种原因被破坏,这会给用户带来潜在的损失风险。

Base58Check的编码方式是这样的:进行编码前,在待编码的内容字符串中加入一个字节的版本信息,版本信息可以自行约定,比如比特币地址采用了0×00作为版本信息,然后再啊计入编码内容字符串的哈希值,通常只要取得哈希值中的4个字节就可以了,加到一起后,然后再整体进行Base58编码。

比特币地址的生成过程中,是将版本字节放在了头部,而将4个字节的哈希值放在了尾部,然后进行编码生成。这个原理还是很简单的,哈希算法具有先天的数据完整性检测能力,在这里我们又看到了哈希算法的又一个应用。

经过整理编码后的数据在传输过程中如果有发生损坏或者篡改,接收方在得到数据后,会对原始数据进行同样的校验码计算,并且和接收到的结果中的校验码进行比较。由于哈希算法的特点,只要原始数据有任何更改,计算出的哈希值都会发生变更,因此只要校验码不一致就说明数据不是合法的。

内容来源:《白话区块链》第三章第三节“编码/解码算法”

作者:蒋勇

以下是我们的社区介绍,欢迎各种合作、交流、学习:)

image

python利用flask框架完成区块链小demo(实现转账,节点更新) 模仿用python flask 写了个小demo 这注释也花了我不少时间 import hashlib # 信息安全加密 import json import time from urllib.parse import urlparse #网络编码解码 from uuid import uuid4 # 生成唯一序列号 import requests #生成网络请求 from flask i... 阅读详情

相关推荐

哈希算法核心原理与Python实践:从数据指纹到安全应用

哈希算法是计算机科学中的基础技术,它将任意长度的数据映射为固定长度的唯一摘要,常被称为数据的“指纹”。其核心原理基于确定性、高效性、抗碰撞性和雪崩效应四大特性,确保相同输入永远产生相同输出,且微小改动会导致结果剧变。这一原理在工程实践中价值巨大,支撑着数据结构的高效实现,例如哈希表(Hash Table)通过O(1)时间复杂度实现快速查找。在安全领域,哈希算法是数据完整性校验和密码存储的基石,通过加盐(Salt)和慢哈希技术,有效防御彩虹表等攻击。本文以Python的hashlib模块为例,深入解析如何正确

weixin_30439067的博客 448

编解码:十六进制编解码

编解码:十六进制编解码 信息有多种表现形式:二进制、十进制、十六进制、字符串… 在计算机中,信息是以二进制的形式来表现。 可以人为定义:0就是假,1就是真,等等。 所谓编解码,是将一种数据以另一种形式来表现,若正向变换称为编码,则其逆向过程则为解码。 计算机中,数据的本质是一串二进制0和1的字符串。 例如,二进制字符串0a代表十进制字符串10,十进制字符串255以二进制的形式表现则为0...

test1280 1万+

Web开发实战:5大核心加密算法原理、选型与避坑指南

加密算法是保障网络通信与数据安全的基石,其核心原理在于通过数学变换将明文信息转换为不可读的密文,从而确保数据的机密性、完整性与身份验证。从技术价值看,它不仅是实现HTTPS、密码存储、数字签名等安全功能的底层支撑,更是构建可信数字环境的必备要素。在Web开发的应用场景中,针对不同需求需精准选型:传输大量数据时采用高效的AES对称加密,安全交换密钥则依赖RSA非对称加密,而密码存储必须使用加盐的SHA-256等哈希算法。本文将聚焦于MD5、SHA-256、AES、RSA和Base64这五种实战高频算法,深入解

weixin_30652897的博客 414

字符16进制加密/解密在线工具

字符16进制加密/解密在线工具:http://www.atoolbox.net/Tool.php?Id=816 将文本加密成16进制形式。

WP8HUB 3万+

CTF新手必备:010Editor从安装到实战破解图片隐写题(附汉化版下载)

本文详细介绍了010Editor在CTF竞赛中破解图片隐写题的应用,从安装配置到实战技巧全面解析。作为专业十六进制编辑器,010Editor凭借二进制模板技术和多种校验算法,能高效分析文件结构、定位隐藏数据,是CTF新手必备工具。文章包含汉化版下载、典型案例解析和高级功能应用指南。

weixin_29213525的博客 495

Wireshark 4.0 分析蚁剑加密流量:5个关键特征与2种解密手法对比

本文深入解析Wireshark 4.0在分析蚁剑加密流量中的应用,详细介绍了5个关键特征识别方法和2种核心解密技术的对比实践。通过协议层指纹、载荷结构、时间行为等特征分析,结合Wireshark原生解密与Python定制方案,帮助安全从业者有效识别和应对蚁剑的加密流量威胁,提升网络安全防护能力。

weixin_33795093的博客 442

浅谈 Base64 编码与解码:原理、变体及实践

Base64是一种将二进制数据编码为文本的常用方案,其核心是将输入字节流按6位一组映射到64个可打印字符。标准Base64使用字符A-Z、a-z、0-9、+和/,而Base64url变体则将+和/替换为-和_以适配URL等场景。编码过程遵循3字节转4字符的规则,体积膨胀约33%。解码时需反向操作,通过位运算恢复原始数据。Base64不提供加密,仅解决二进制数据在文本协议中的兼容性问题。工程实践中需注意字符集转换、填充处理以及变体间的互转规则,避免常见误区。

青衫客36的博客 1915

C# 十六进制编码与解码

在开发和处理二进制数据时,十六进制编码和解码是一项常见的任务。C# 提供了一些内置的方法和类来处理这些操作,使得在处理字节数据时更加方便和高效。本文将介绍如何在 C# 中进行十六进制编码和解码,并附带相应的源代码和描述。通过以上的示例代码,我们可以在 C# 中实现十六进制编码和解码的功能。十六进制解码是将十六进制字符串转换回原始的二进制数据的过程。十六进制编码是将二进制数据转换为十六进制字符串表示的过程。最后,打印输出了生成的十六进制字符串。方法将解码得到的字节数组转换回十六进制字符串,并进行打印输出。

XisVisual_Basic的博客 781

【限时免费】 4.10热门项目推荐:dongle - 让Golang加密编码更简单

4.10热门项目推荐:dongle - 让Golang加密编码更简单 【免费下载链接】dongle 一个轻量级、语义化、对开发者友好的 golang 编码解码、加密解密和签名验签库 项目地址: https://gitcode.co...

gitblog_01410的博客 430

Go写的分片区块链实验项目:含BFT共识、Merkle树和多监控后端支持

这个Go语言实现的分片区块链项目,聚焦教学与工程验证场景,提供可运行的轻量级参考实现。核心功能包括基于BFT-Cosi的拜占庭容错共识机制、标准Merkle树构建与验证、交易与区块的二进制编解码(encode.go/decode.go)、本地LevelDB存储(database.go)、P2P节点通信骨架(handler.go、registry.go)以及运行时指标采集系统。监控能力覆盖InfluxDB、Graphite和OpenTSDB三种后端,通过meter.go、histogram.go、timer.

cicd6pipeline的博客 228

hex:简单的十六进制字符串编码器解码器

hex - 编码和解码十六进制字符串 用于编码和解码十六进制字符串的简单工具。 用法: var hex = require('hex'); var encodedString = hex.encode('Hello world'); // encodedString == "48656c6c6f20776f726c64" var string = hex.decode('466f6f'); // string == 'Foo'

BigInt与数据转换:掌握Swift大整数的序列化、字符串互转及NSData操作终极指南

在Swift开发中处理超大整数时,BigInt库提供了完整的任意精度整数解决方案。本文将深入探讨BigInt的数据转换功能,包括字符串互转、二进制序列化以及NSData操作,帮助开发者轻松处理大整数的存储和传输需求。😊 ## 📊 BigInt数据转换的核心功能概览 BigInt库不仅提供了基本的算术运算,还内置了强大的数据转换系统,让开发者能够: - **字符串与BigInt互转**:支

gitblog_00300的博客 359

小红书x-mini签名逆向实战:Frida动态Hook与算法还原

在移动App协议分析中,请求签名机制是保障接口安全的核心技术,其本质是客户端对请求参数、时间戳、设备指纹等要素进行加密认证的过程。理解签名原理需掌握Native层加密流程、JNI调用机制及密钥动态派生逻辑。Frida作为主流动态插桩工具,能绕过符号剥离、字符串加密和控制流混淆等反分析手段,在函数执行瞬间捕获寄存器状态、内存数据与调用上下文,实现签名算法的完整还原。该技术广泛应用于合规内容监测、API自动化调用与竞品协议研究等工程场景。本文聚焦小红书x-mini签名这一典型样本,详解从JNI_OnLoad定位

weixin_31264565的博客 457

神圣几何视觉标记系统:从图像编码到元宇宙标识的实践指南

图像编码与计算机视觉是数字信息处理的基础技术,其核心原理在于将数据转化为机器可读的视觉模式,并通过算法进行识别与解析。这项技术的价值在于实现信息与视觉形态的可靠绑定,为数字身份、资产标识和交互系统提供底层支持。在元宇宙、数字艺术和增强现实等应用场景中,视觉标记系统能够创建兼具美学与功能性的唯一标识符。本文聚焦于基于特定几何符号与色彩频率的视觉标记生成与识别系统,探讨其技术实现与部署方案,其中涉及GPU加速和API接口集成等关键实践环节,为构建可落地的符号生成与识别应用提供参考。

weixin_30718391的博客 605

深入浅出DDR系列(二)--DDR工作原理

学习完了DDR的基本组成和硬件结构原理之后,从整体上了解了DDR的特性和静态图,包括原理、管脚图等。那么本章就要从动态的角度来分析时序结构,包括read/write的整个过程到数据返回发生了什么,其中包括以下内容 DDR是如何完成Read、Write 等的操作 DDR的基本命令 DDR的时序参数 DDR的性能分析 1. DRAM基本组成 对于DRAM,其主要由行和列组成,每一个bit中都是由类似右下图的类晶体管的结构组成,对于sdram的数据,可以通过控制column和row就可以访问sd

奇小葩 3万+

WRF进阶:定制Vtable文件解析非标准气象数据源——以ERA5-Land土壤湿度为例

本文详细介绍了如何为WRF模式定制Vtable文件,以解析非标准气象数据源ERA5-Land的土壤湿度数据。通过剖析GRIB文件结构、详解Vtable编写逻辑与语法,并提供了从数据验证到metgrid配置的完整实战流程,帮助用户突破标准数据源限制,实现高精度陆面过程模拟。

o4p5q6r7s的博客 390

Prettier 中日韩(CJK)Markdown 文本格式化:splitCjkText 测试集与空白处理机制全解析

本篇指南以 Prettier 仓库中的 Markdown 测试夹具 [tests/format/markdown/splitCjkText/chinese-japanese.md](https://link.gitcode.com/i/049537d2f898249e2dd7b3114d506dec) 为切入点,深入剖析 Prettier 在处理中文、日文(以及韩文)Markdown 文本时的切词

gitblog_00227的博客 841

Logstash安装部署

1. 部署及安装所用的用户不能是root。

lmj3732018的博客 4289

AudioSeal Pixel Studio应用场景:司法录音证据完整性校验与原始性存证

本文介绍了如何在星图GPU平台上自动化部署🌊 专业级音频水印加印AudioSeal Pixel Studio镜像,实现司法录音证据的完整性校验与原始性存证。该技术通过数字水印嵌入和检测,有效解决录音证据易篡改、来源难追溯等问题,适用于司法机构的证据采集与核验场景,提升司法效率与证据可信度。

weixin_36064575的博客 156

2026工控高薪:C#上位机面试15题(含答案)

基础岗(10-15K):考察串口/Modbus/PLC通信基础;资深岗(20-30K):考察工业级优化(抗干扰/断线重连)、物联网(MQTT)、跨协议整合;架构岗(30K+):考察上位机架构设计、边缘计算、项目落地避坑。我整理了2026年近20场高薪岗位(月薪20K+)的面试高频题,筛选出15道核心题,每题标注“考察点+实战答案”——答案拒绝纯理论,全部结合车间现场、PLC通信、物联网落地等真实场景,帮你避开“背答案但不落地”的面试坑。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1273

北斗导航 | 卡尔曼滤波与因子图优化对比(附图优化matlab代码)

- 历史数据利用:因子图通过滑动窗口保留历史状态,优化时联合多帧数据;卡尔曼滤波仅依赖当前和上一帧状态 。 - 迭代优化:因子图通过多次迭代逼近最优解,卡尔曼滤波仅单次更新 。 - 误差抑制:因子图的多次线性化可有效抑制非线性误差(如GNSS伪距观测的非线性) 。

尘世冰封的专栏 1299

Java SHA算法实战:从数据完整性校验到密码安全存储

哈希函数是计算机安全领域的基石技术,它通过确定性算法将任意长度数据映射为固定长度的摘要值,具备单向性和雪崩效应等核心特性。其技术价值在于保障数据完整性与身份验证,广泛应用于软件分发校验、区块链、数字签名等场景。在工程实践中,Java的MessageDigest类提供了标准实现,但需注意字符编码一致性、流式处理大文件等关键细节。对于密码存储等安全敏感场景,直接使用SHA等快速哈希算法存在彩虹表攻击风险,必须结合加盐和慢哈希技术(如PBKDF2WithHmacSHA256),并采用恒定时间比较等防护措施,才能构

ciqiaofu0192的博客 468

谱方法学习笔记-下(超详细)

《谱方法学习笔记》深入介绍了傅立叶谱方法在解决偏微分方程问题中的理论和实践,提供了清晰的步骤、Matlab代码以及对一维、二维波动方程等不同问题的解析,适合对谱方法感兴趣的学习者。

图灵的猫的博客 2853
上一篇: Linux环境下搭建Hyperledger Fabric(附流程代码)
下一篇: Solidity语言编辑器REMIX指导大全
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值