HBase 关键字及大小写问题,中文的十六进制编码

关键字可以不加引号


这是HBase Shell中的一个语法规则。


一、为什么 METHOD 不需要引号?

因为 METHOD 是 HBase Shell 的关键字,不是字符串。

text

HBase Shell 底层是 Ruby 语言环境
Ruby 中,有些单词被识别为符号(Symbol),写法是 :method 或 method

在 HBase Shell 中:
- METHOD 被当作符号处理
- 不加引号也能识别
- 也可以加引号,两种都支持

二、两种写法都正确

bash

# 写法1:不加引号(推荐,HBase官方文档写法)
alter_namespace 'a2608', {METHOD => 'set', 'date_time' => '20260529'}

# 写法2:加引号(也正确)
alter_namespace 'a2608', {'METHOD' => 'set', 'date_time' => '20260529'}

# 写法3:使用符号(Ruby语法)
alter_namespace 'a2608', {:METHOD => 'set', 'date_time' => '20260529'}

三、HBase Shell 中常见的关键字(可加可不加引号)

关键字说明使用场景
METHOD指定操作方法{METHOD => 'set'}
NAME指定列簇名称{NAME => 'info'}
VERSIONS设置版本数{NAME => 'info', VERSIONS => 3}
COMPRESSION设置压缩算法{NAME => 'info', COMPRESSION => 'SNAPPY'}
TTL设置数据存活时间{NAME => 'info', TTL => 2592000}
BLOOMFILTER设置布隆过滤器{NAME => 'info', BLOOMFILTER => 'ROW'}
REPLICATION_SCOPE设置复制范围{NAME => 'info', REPLICATION_SCOPE => 1}
KEEP_DELETED_CELLS是否保留删除的单元格{NAME => 'info', KEEP_DELETED_CELLS => true}
BLOCKCACHE是否开启块缓存{NAME => 'info', BLOCKCACHE => true}
BLOCKSIZE设置块大小{NAME => 'info', BLOCKSIZE => 65536}

四、必须加引号的情况

用户自定义的字符串(属性名、表名、列簇名、值)必须加引号

bash

# ✅ 正确:用户自定义的内容加引号
alter_namespace 'a2608', {METHOD => 'set', 'date_time' => '20260529'}
#                                            ↑           ↑
#                                     用户自定义属性名  用户自定义值

# ✅ 正确:建表时列簇名加引号
create 'student', 'info', 'score'
#                 ↑      ↑
#              用户定义的列簇名

# ❌ 错误:用户自定义内容不加引号
alter_namespace 'a2608', {METHOD => 'set', date_time => 20260529}
#                                            ↑ 报错!

五、总结对照表

内容类型是否需要引号示例
关键字(METHOD, NAME, VERSIONS...)❌ 不需要(也可以加)METHOD => 'set'
命名空间名✅ 必须加'a2608'
表名✅ 必须加'student'
列簇名✅ 必须加'info'
列限定符✅ 必须加'name'
属性名(用户自定义)✅ 必须加'date_time'
属性值(用户自定义)✅ 必须加'20260529'

六、快速判断技巧

text

问自己:这个单词是 HBase 命令本身定义的,还是我自己起的名字?

- HBase 定义的(关键字)→ 可以不加引号
- 我自己起的(表名、列簇名、属性名)→ 必须加引号

例子:

bash

# METHOD = HBase定义的关键字 → 可以不加引号
# 'set' = 用户写的值 → 必须加引号
# 'date_time' = 用户自定义的属性名 → 必须加引号
# '20260529' = 用户自定义的值 → 必须加引号

alter_namespace 'a2608', {METHOD => 'set', 'date_time' => '20260529'}

这个规则同样适用于 altercreatedescribe 等命令的列簇属性设置:

bash

# 修改列簇属性
alter 'student', {NAME => 'info', VERSIONS => 5, TTL => 2592000}
#                 ↑           ↑           ↑
#              关键字      关键字       关键字(都不加引号)

关键字不一定需要大写,但强烈建议大写!


一、HBase Shell 关键字的写法规则

HBase Shell 底层是 Ruby 环境,关键字不区分大小写,但官方文档和实际使用中习惯大写

bash

# 以下三种写法都正确,都能执行

# 1. 大写(官方推荐)
alter_namespace 'a2608', {METHOD => 'set', 'date_time' => '20260529'}

# 2. 小写(也能执行)
alter_namespace 'a2608', {method => 'set', 'date_time' => '20260529'}

# 3. 大小写混合(也能执行)
alter_namespace 'a2608', {Method => 'set', 'date_time' => '20260529'}

二、为什么建议大写?

原因说明
官方规范HBase 官方文档、示例代码都用大写
可读性强一眼就能区分"关键字"和"用户自定义内容"
行业惯例所有 HBase 使用者都这么写,便于交流
避免混淆关键字大写,自己的内容加引号,清晰明了

三、示例对比

bash

# 推荐写法(关键字大写,用户内容加引号)
alter 'student', {NAME => 'info', VERSIONS => 3, TTL => 2592000}
create 'student', 'info', 'score'
alter_namespace 'a2608', {METHOD => 'set', 'author' => 'jinqiu'}

# 不推荐(虽然能执行,但看着乱)
alter 'student', {name => 'info', versions => 3, ttl => 2592000}
alter_namespace 'a2608', {method => 'set', 'author' => 'jinqiu'}

四、常见关键字写法对照

关键字大写(推荐)小写(也可以)说明
METHODMETHODmethod操作方法
NAMENAMEname列簇名称
VERSIONSVERSIONSversions版本数
TTLTTLttl存活时间
COMPRESSIONCOMPRESSIONcompression压缩算法
BLOOMFILTERBLOOMFILTERbloomfilter布隆过滤器
REPLICATION_SCOPEREPLICATION_SCOPEreplication_scope复制范围
KEEP_DELETED_CELLSKEEP_DELETED_CELLSkeep_deleted_cells保留删除单元格
BLOCKCACHEBLOCKCACHEblockcache块缓存

五、总结

text

规则:关键字不区分大小写
建议:全部大写

为什么?
  一是官方这么写
  二是看着清晰
  三是大家都懂

简单记:关键字大写 + 用户内容引号 = 标准写法

bash

标准写法示例:
{NAME => 'info', VERSIONS => 3, METHOD => 'set'}
  ↑            ↑      ↑           ↑
大写         引号    大写        引号

中文的十六进制编码


不是乱码,这是中文的十六进制编码显示。


一、这是什么?

text

value=\xE6\xB5\x8B\xE8\xAF\x95\xE6\x95\xB0\xE6\x8D\xAE

这是 "测试数据" 四个字的 UTF-8 编码,每个中文占3个字节:

字节序列对应的字
\xE6\xB5\x8B
\xE8\xAF\x95
\xE6\x95\xB0
\xE6\x8D\xAE

二、为什么会这样显示?

HBase 存储的是字节数组,不是字符串。

  • HBase 不关心你存的是什么类型(文字、图片、序列化对象...)

  • 它只管存字节

  • 显示时,能显示成字符的就显示字符

  • 显示不了的(或编码问题)就显示十六进制 \xXX


三、如何正常显示中文?

方法1:查询时指定编码(推荐)

bash

get 'a2608:student', '001', {FORMATTER => 'toString'}

方法2:扫描时指定编码

bash

scan 'a2608:student', {FORMATTER => 'toString'}

方法3:使用 cat 命令(Linux环境)

bash

echo "get 'a2608:student', '001'" | hbase shell | grep -v '^Took'

方法4:查看单个值

bash

get 'a2608:student', '001', 'info:name'

四、你现在试试

bash

# 正常显示中文
get 'a2608:student', '001', {FORMATTER => 'toString'}

预期输出:

text

COLUMN                         CELL
 info:age                      timestamp=..., value=20
 info:name                     timestamp=..., value=测试数据

五、为什么 age 显示正常,name 显示乱码?

数据存储内容显示结果
20数字(ASCII)直接显示 20
测试数据中文(UTF-8多字节)显示十六进制

结论: 你的数据没问题,存进去的就是"测试数据",只是显示方式问题。

bash

# 验证数据是否正确(导出到文件看)
echo "get 'a2608:student', '001', 'info:name'" | hbase shell > /tmp/result.txt
cat /tmp/result.txt

六、永久解决(修改HBase配置)

让HBase默认显示字符串而不是十六进制:

bash

# 编辑 HBase 配置文件
vim $HBASE_HOME/conf/hbase-site.xml

# 添加以下配置
<property>
  <name>hbase.display.encoding</name>
  <value>UTF-8</value>
</property>

需要重启HBase生效。


简单记忆: {FORMATTER => 'toString'} 加在查询后面就能正常看中文了。

内容概要:本文详细记录了对一个Android ARM64静态ELF文件中字符串加密机制的逆向分析过程。该ELF文件的所有字符串均被加密,无法通过常规strings命令或IDA直接识别。作者通过分析发现,加密字符串存储在.rodata段,其解密所需信息(包括密文地址、长度和16位密钥)保存在.data.rel.ro段的40字节描述符中。核心解密函数sub_10F408采用自反的双pass流密码算法,结合固定密钥KEY_TERM(由.data段24字节数据计算得出),实现字节级非线性、位置与长度相关的加密。文章还复现了完整的Python解密脚本,并揭示了该保护机制的本质为代码混淆而非强加密,最终成功批量解密全部956条字符串,暴露程序真实行为,如shell命令模板、设备标识篡改、网络重置等操作。此外,文中还提及未启用的自定义壳框架及其反dump设计。; 适合人群:具备逆向工程基础的安全研究人员、二进制分析人员及对ELF保护技术感兴趣的开发者。; 使用场景及目标:①学习ELF二进制中字符串加密的典型实现方式与逆向突破口;②掌握从结构识别、函数追踪到算法还原的完整逆向流程;③理解“绑定二进制”的完整性校验设计及其局限性;④实践编写IDAPython脚本自动化提取与解密敏感数据。; 阅读建议:此资源以实战案例驱动,不仅展示技术细节,更强调逆向思维与验证方法,建议读者结合IDA调试环境,逐步跟随文中步骤进行动态分析与算法验证,深入理解每一步的推理依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星汉灿烂星河

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值