当前位置: 首页 > news >正文

鸿蒙系统开发【ASN.1密文转换】安全

ASN.1密文转换

介绍

本示例对使用@kit.CryptoArchitectureKit加密后的密文格式进行转换。@kit.CryptoArchitectureKit加密后的密文格式默认为以base64显示的ASN.1格式问题,通过对密文进行base64变换后得到字符数组,以16进制数字显示,再此基础上进行密文格式转换,从ASN.1格式转换为c1c3c2格式的裸密文,再以c1c3c2格式的裸密文进行解密,以验证密文转换的正确性。

效果预览

1

使用说明

  1. 点击主页面加密按钮,对原始数据使用SM2国密算法进行加密,其内容显示在加密数据文本框中, 此时解密按钮和base64转换按钮使能
  2. 点击主页面base64转换按钮,对原始密文进行base64转换,在加密数据文本框中显示转换后的密文 此时asn.1转换按钮使能
  3. 点击主页面asn.1转换按钮,对密文进行asn.1转换,在加密数据文本框中显示转换后的密文 此时加密按钮和base64转换按钮去使能
  4. 点击主页面解密按钮,对密文进行解密,在解密数据文本框中显示解密后的文本 此时解密按钮去使能

具体实现

  • 对文本加密:在[SM2.ets] 点击加密按钮,调用加密函数实现对文本内容进行加密。点击解密按钮,调用解密函数实现对文本内容进行解密. 对消息加密的过程中采用cryptoFramework.Cipher完成加解密操作。
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { print } from '@kit.BasicServicesKit';
import { buffer, util } from '@kit.ArkTS';
import { SM2CipherText } from './SM2CipherText';async function genECCPubKey(key: string) {let mode: number = 1;let pk: cryptoFramework.Point = {x: BigInt(""),y: BigInt(""),};if ((mode & 0x01) != 0 && key != null) {pk = {x: BigInt("0x" + key.substring(0, 64)),y: BigInt("0x" + key.substring(64, 128)),}}let keyPairGenerator: cryptoFramework.AsyKeyGeneratorBySpec;let pubKeySpec: cryptoFramework.ECCPubKeySpec = {params: genSM2CommonSpec(),pk: pk,algName: "ECC",specType: cryptoFramework.AsyKeySpecType.PUBLIC_KEY_SPEC};keyPairGenerator = cryptoFramework.createAsyKeyGeneratorBySpec(pubKeySpec);return await keyPairGenerator.generatePubKey();
}async function genECCPriKey(key: string) {let mode: number = 2;let sk: bigint = BigInt("");if ((mode & 0x02) != 0) {sk = BigInt("0x" + key);}let keyPairGenerator: cryptoFramework.AsyKeyGeneratorBySpec;let priKey: cryptoFramework.ECCPriKeySpec = {params: genSM2CommonSpec(),sk: sk,algName: "ECC",specType: cryptoFramework.AsyKeySpecType.PRIVATE_KEY_SPEC};keyPairGenerator = cryptoFramework.createAsyKeyGeneratorBySpec(priKey);return await keyPairGenerator.generatePriKey();
}export function genSM2CommonSpec(): cryptoFramework.ECCCommonParamsSpec {let fieldFp: cryptoFramework.ECFieldFp = {fieldType: "Fp",p: BigInt("0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF")}let G: cryptoFramework.Point = {x: BigInt("0x32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7"),y: BigInt("0xBC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0")}let SM2CommonSpec: cryptoFramework.ECCCommonParamsSpec = {algName: "ECC",specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC,field: fieldFp,a: BigInt("0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC"),b: BigInt("0x28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93"),g: G,n: BigInt("0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123"),h: 1}return SM2CommonSpec;
}export async function genSM2Key(pubKey: cryptoFramework.DataBlob | null, priKey: cryptoFramework.DataBlob | null): Promise<cryptoFramework.KeyPair> {let generator = cryptoFramework.createAsyKeyGenerator("SM2_256");return await generator.convertKey(pubKey, priKey)
}async function encryptByPrimalKey(message: string, key: string): Promise<string> {let base64Helper = new util.Base64Helper();console.log(`key len: ${key.length}`);let pubKey = await genECCPubKey(key);let keyPair = await genSM2Key(pubKey.getEncoded(), null);let cipher = cryptoFramework.createCipher("SM2_256|SM3");await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, keyPair.pubKey, null);let plainTextBlob: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) };let encryptBlob = await cipher.doFinal(plainTextBlob);return base64Helper.encodeToStringSync(encryptBlob.data);
}export async function encryptSM2(message: string) {let pubKey: string = "5A033A9DBEF84C0784C897D070E6608C5AEED39B806DF82853D64E2A686A3794" + "F9233D20DD878F642D61C2B0344988AE284646226767A1631BBB0DBB6DF40D07"return encryptByPrimalKey(message, pubKey);
}async function decryptByPrimalKeyArray(messageArray: Uint8Array, key: string): Promise<string> {let priKey = await genECCPriKey(key);let keyPair = await genSM2Key(null, priKey.getEncoded());let cipher = cryptoFramework.createCipher("SM2_256|SM3");await cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, keyPair.priKey, null);let plainTextBlob: cryptoFramework.DataBlob = { data: messageArray };let decryptBlob = await cipher.doFinal(plainTextBlob);return buffer.from(decryptBlob.data).toString('utf-8');
}export async function decryptSM2(encryptedStr: string, isc1c3c2: Boolean = false): Promise<string> {let priKey: string = "3629EFF03FBC86711F6695CBF5590F0F2FCAAA3C269A1CA9BD64FB4C70DF9C9F"if (isc1c3c2) {let hexStr = new SM2CipherText().i2dSM2CipherText(encryptedStr);let encryptedArray = new Uint8Array(buffer.from(hexStr, 'hex').buffer);return decryptByPrimalKeyArray(encryptedArray, priKey);}else {let base64Helper = new util.Base64Helper;let message = base64Helper.decodeSync(encryptedStr);return decryptByPrimalKeyArray(message, priKey);}
}
  • 对密文格式进行转换:在[SM2CipherText.ets]点击asn.1按钮,调用密文转换函数实现对密文内容进行转换。 完成密文转换操作。
import { SM2Sequence } from './SM2Sequence';
import { hilog } from '@kit.PerformanceAnalysisKit';export class ASN1Util {static readonly BOOLEAN: string = "01";static readonly INTEGER: string = "02";static readonly BIT_STRING: string = "03";static readonly OCTEN_STRING: string = "04";static readonly NULL: string = "05";static readonly REAL: string = "09";static readonly ENUMERATED: string = "0a";static readonly SEQUENCE: string = "30";static readonly SET: string = "31";
}export class SM2CipherText {i2dSM2CipherText(primal_data: string): string {let sm2_sequence = new SM2Sequence();sm2_sequence.C1x = primal_data.slice(0, 64);primal_data = primal_data.slice(64, primal_data.length);sm2_sequence.C1y = primal_data.slice(0, 64);primal_data = primal_data.slice(64, primal_data.length);sm2_sequence.C3 = primal_data.slice(0, 64);primal_data = primal_data.slice(64, primal_data.length);sm2_sequence.C2 = primal_data;let C1x_title: string = (Number.parseInt("0x" + sm2_sequence.C1x.slice(0, 2)) > 127) ? "022100" : "0220";let C1y_title: string = (Number.parseInt("0x" + sm2_sequence.C1y.slice(0, 2)) > 127) ? "022100" : "0220";let C3_title: string = "0420";let C2_title: string = "04" + this.genLenHex(sm2_sequence.C2);let sequence_message: string = C1x_title + sm2_sequence.C1x + C1y_title + sm2_sequence.C1y + C3_title + sm2_sequence.C3 + C2_title + sm2_sequence.C2;let sequence_lenHex: string = this.genLenHex(sequence_message);let standard_data = "30" + sequence_lenHex + sequence_message;return standard_data;}d2iSM2CipherText(standard_data: string): string {let message: string = standard_data;if (!message.startsWith(ASN1Util.SEQUENCE)) {this.ciphertextErr();}message = message.slice(ASN1Util.SEQUENCE.length, message.length);let sequence_lexHex: string = this.getLenHex(message);message = message.slice(sequence_lexHex.length, message.length);let sequence_len: number = this.lenHex2number(sequence_lexHex);if (sequence_len != message.length / 2) {this.ciphertextErr();}let sm2_sequence = new SM2Sequence();message = this.readC1(sm2_sequence, message);message = this.readC3(sm2_sequence, message);message = this.readC2(sm2_sequence, message);console.log(sm2_sequence.toString());let primal_data: string = sm2_sequence.C1x + sm2_sequence.C1y + sm2_sequence.C3 + sm2_sequence.C2;return primal_data;}genLenHex(content: string): string {let size: number = content.length / 2;let lenHex: string;if (size.toString(16).length % 2 == 1) {lenHex = '0' + size.toString(16);} else {lenHex = size.toString(16);}if (size < 0x80) {return lenHex;}let lenHex_size: number = lenHex.length / 2;return (lenHex_size | 0x80).toString(16) + lenHex;}getLenHex(data: string): string {let byte: number = Number.parseInt("0x" + data.slice(0, 2));let len_size: number = byte > 127 ? byte - 0x80 + 1 : 1;return data.slice(0, len_size * 2);}lenHex2number(lenHex: string): number {if (lenHex.length == 2) {return Number.parseInt("0x" + lenHex);}return Number.parseInt("0x" + lenHex.slice(2, lenHex.length));}ciphertextErr() {hilog.error(0, "d2i_SM2_Ciphertext", "密文格式错误");throw new Error("SM2 ciphertext error!");}readC1(sm2_sequence: SM2Sequence, data:string): string {let xy: string[] = [];for (let i = 0; i < 2; i++) {if (data.startsWith("0220")) {xy[i] = data.slice(4, 68);data = data.slice(68, data.length);} else if (data.startsWith("022100")) {xy[i] = data.slice(6, 70);data = data.slice(70, data.length);} else {this.ciphertextErr();}}sm2_sequence.C1x = xy[0];sm2_sequence.C1y = xy[1];return data;}readC2(sm2_sequence: SM2Sequence, data:string): string {if (data.startsWith(ASN1Util.OCTEN_STRING)) {data = data.slice(ASN1Util.OCTEN_STRING.length, data.length);let C2_lenHex = this.getLenHex(data);data = data.slice(C2_lenHex.length, data.length);if (this.lenHex2number(C2_lenHex) != data.length / 2) {this.ciphertextErr();}sm2_sequence.C2 = data;}else {this.ciphertextErr();}return data;}readC3(sm2_sequence: SM2Sequence, data:string): string {if (data.startsWith("0420")) {sm2_sequence.C3 = data.slice(4, 68);data = data.slice(68, data.length);}else {this.ciphertextErr();}return data;}
}

以上就是本篇文章所带来的鸿蒙开发中一小部分技术讲解;想要学习完整的鸿蒙全栈技术。可以在结尾找我可全部拿到!
下面是鸿蒙的完整学习路线,展示如下:
1

除此之外,根据这个学习鸿蒙全栈学习路线,也附带一整套完整的学习【文档+视频】,内容包含如下

内容包含了:(ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、鸿蒙南向开发、鸿蒙项目实战)等技术知识点。帮助大家在学习鸿蒙路上快速成长!

鸿蒙【北向应用开发+南向系统层开发】文档

鸿蒙【基础+实战项目】视频

鸿蒙面经

在这里插入图片描述

为了避免大家在学习过程中产生更多的时间成本,对比我把以上内容全部放在了↓↓↓想要的可以自拿喔!谢谢大家观看!

相关文章:

鸿蒙系统开发【ASN.1密文转换】安全

ASN.1密文转换 介绍 本示例对使用kit.CryptoArchitectureKit加密后的密文格式进行转换。kit.CryptoArchitectureKit加密后的密文格式默认为以base64显示的ASN.1格式问题&#xff0c;通过对密文进行base64变换后得到字符数组&#xff0c;以16进制数字显示&#xff0c;再此基础…...

【期末复习】软件质量保证与测试

考试内容 a卷 前三个部分(就业前景、岗位、发展前景(第一部分最后一个知识点),第四部分缺陷管理不考) 单选 10*2 判断 12*1 简单3*10 四个小题 (7个 pta部分涵盖+ppt) 设计 10+18 简答题(PTA简答题+PPT) 背完80分以上基本没问题 一、什么是软件。 软件是计算…...

CTFHub——XSS——反射型

1、反射型&#xff1a; 发现为表单式&#xff0c;猜测哪个可能存在注入漏洞&#xff0c;分别做测试注入发现name框存在xss漏洞 输入发现有回显但不是对方cookie&#xff0c;参考wp发现要用xss线上平台 将xss平台测试语句注入&#xff0c;将得到的url编码地址填入url框&#xf…...

docker 部署 libreoffice

创建 jdk 镜像 1、创建 Dockfile 文件 FROM centos:7 ADD jdk-8u212-linux-x64.tar.gz /usr/local RUN mv /usr/local/jdk1.8.0_212 /usr/local/jdk ENV JAVA_HOME=/usr/local/jdk ENV JRE_HOME=$JAVA_HOME/jre ENV CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH ENV P…...

预测各种开发语言的市场占比

预测各种开发语言的市场占比是一个复杂且动态的任务&#xff0c;因为它受到多种因素的影响&#xff0c;包括市场需求、技术趋势、项目类型、开发团队的经验和偏好等。然而&#xff0c;我可以根据当前的技术趋势、编程语言排行榜以及市场需求情况&#xff0c;给出一个大致的预测…...

mybatisplus 通用字段自动赋值与更新

1、数据库级别的自动赋值与更新 比如自动更新时间和插入时间 default current_timestamp 插入的时候获取当前 default current_timestamp on update current_timestamp 修改的时候更新时间 无法用数据库更新的通用字段 借助 mybatisplus 的 metaobjecthandler 实现metaob…...

图像生成中图像质量评估指标—FID介绍

文章目录 1. 背景介绍2. 实际应用3. 总结和讨论 1. 背景介绍 Frchet Inception Distance&#xff08;\textbf{FID}&#xff09;是一种衡量生成模型性能的指标&#xff0c;它基于Inception网络提取的特征来计算模型生成的图像与真实图像集合之间的距离。 FID利用了Inception模…...

uniapp全局分享功能实现方法(依赖小程序右上角的分享按钮)

1、uniapp开发小程序时默认是关闭分享功能的。点击右上角三个点可查看&#xff0c;效果图如下&#xff1a; 2、在utils文件夹下新建share.js文件&#xff0c;名字任起。&#xff08;使用的是全局分享&#xff0c;因为一个一个页面的去分享太麻烦且没必要。&#xff09; export…...

Redis中BigKey的判定查找建议

判定依据 key本身的数据量过大:string类型的key它的值为5MBkey中的成员数量过多:一个zset类型的key成员数量为10000个key中的成员数据量过大:一个hash类型的key他的成员只有1000个但是这些value总大小超过100MB查看内存命令 127.0.0.1:6379> hset k1 name 123 age 123 sex…...

Swift-语法基础

一、声明 变量声明 以关键字 var 开头的声明引入变量&#xff0c;该变量在程序执行期间可以具有不同的值。 var str: String "hello" str "hello, world" 常量声明 以关键字 let 开头的声明引入只读常量&#xff0c;该常量只能被赋值一次。 let s…...

面向对象进阶:多态、内部类、常用API

目录 Java中的接口 Java中的内部类 常用API StringBuilder类 Java高级面向对象编程 在这篇博客文章中&#xff0c;我们将探索Java中的高级面向对象编程概念&#xff0c;包括接口、内部类和常用API。每个概念都将通过代码示例来演示它们的应用。 Java中的接口 什么是接口&…...

寸(英寸)、码、斤、公顷等日常中大概的换算单位你清楚吗

这些单位和概念是我们日常生活和工作中不可或缺的部分&#xff0c;理解它们的用途和转换关系可以让我们更有效地处理信息、进行交流和解决问题。 1、寸&#xff08;英寸&#xff09; 1寸&#xff08;或英寸&#xff09;等于0.0254米&#xff0c;2寸等于&#xff1a;20.0254&a…...

Python面试宝典第26题:最长公共子序列

题目 一个字符串的子序列是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;也可以不删除任何字符&#xff09;后组成的新字符串。比如&#xff1a;"ace" 是 "abcde" 的子序列&#xff0c;但 "…...

接口测试学习笔记2

一、复习和扩展&#xff1a; 1、金字塔测试模型 UI测试 -- 黑盒 Service 服务层--函数之间的调用 灰盒 接口测试 Unit单元层--白盒测试 趋势&#xff1a;逐步向下发展 测试优先、测试驱动 -- 先考虑怎么测&#xff0c;再考虑怎么开发 满足软件测试的可控范围 2、…...

vue3修改带小数点的价格数字:小数点的前后数字,要分别显示成不同颜色和大小!已经封装成组件了!

需求&#xff1a; 修改带小数点的价格数字&#xff1a;小数点的前后数字&#xff0c;要分别显示成不同颜色和大小&#xff01;已经封装成组件了&#xff01; 效果&#xff1a; 前面大&#xff0c;后面小 代码&#xff1a; 组件&#xff1a; <!--修改小数点前后数字不同…...

JVM(Java虚拟机) - JVM内存分配与内存管理

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有疑问和建议&#xff0c;请私信或评论留言&#xff01; 前言 Java虚拟机&…...

Linux中vim的基本介绍和使用

善为理者&#xff0c;举其纲&#xff0c;疏其网。 vim 1、vim介绍2、命令模式详情3、底行模式详情4、困难问题5、历史存疑问题6、vim配置问题6、1、配置的原理6、2、一键式配置 1、vim介绍 如果我面想要在Linux上编写代码的话&#xff0c;我就需要vim来帮助我们编写代码。但是…...

宝塔面板上,安装rabbitmq

废话不多说&#xff0c;直接上干货&#xff01; 第一步&#xff1a;登录宝塔账号&#xff0c;在软件商店里搜索 第二步&#xff1a;点击设置 第三步&#xff1a;已经完成了&#xff0c;还看啥&#xff01;...

【Docker系列】Docker 镜像管理:删除无标签镜像的技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

数据采集器

目录 1. 采集Redis 2. 采集MySQL 3. 采集容器 1. 采集Redis 出口商和集成 |普罗 米修斯 (prometheus.io) 发布 奥利弗006/redis_exporter (github.com) 在目标机器上安装redis 上传redis采集器包redis_exporter-v1.53.0.linux-amd64.tar.gz [rootharbor opt]# tar -xf …...

小红书0510笔试-编程题

解题思路&#xff1a; 先射击左边和先射击右边两种情况&#xff0c;就是2*1/n*(n-1)的概率。 解题思路&#xff1a; 枚举所有的评论作为最小值&#xff0c;按评论从大到小排序&#xff0c;每次遍历到的都是最小值。要想得到以该评论为最小值的最大优秀度&#xff0c;就要维护一…...

2024年热门开放式耳机评测!悠律、韶音、声阔到底该选谁?

开放式耳机选购技巧篇&#xff0c;可参考选购&#xff01; 作为一名数码评测博主&#xff0c;这两年用过的开放式耳机不下50款了&#xff0c;市面上的开放式耳机众多&#xff0c;很多人不知道该如何选择&#xff0c;其实选购都是有一定的技巧和规律性的&#xff0c;看配置就能…...

计算机毕业设计选题推荐-智慧物业服务系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

新手小白学习PCB设计,立创EDA专业版

本教程有b站某UP主的视频观后感 视频链接&#xff1a;http://【【教程】零基础入门PCB设计-国一学长带你学立创EDA专业版 全程保姆级教学 中文字幕&#xff08;持续更新中&#xff09;】https://www.bilibili.com/video/BV1At421h7Ui?vd_sourcefedb10d2d09f5750366f83c1e0d4a…...

查物流信息用什么软件

在电子商务日益繁荣的今天&#xff0c;快递物流信息的查询成为了我们日常生活中不可或缺的一部分。无论是网购达人还是商家&#xff0c;都需要随时掌握货物的物流动态。然而&#xff0c;如何快速、准确地查询物流信息却是一个令人头疼的问题。今天&#xff0c;我将为大家介绍一…...

(40)温度传感器

文章目录 前言 1 设置 2 记录 3 参数说明 前言 ArduPilot 已经有许多可能的温度报告来源&#xff1a;电调&#xff0c;智能电池&#xff0c;电机 EFI&#xff0c;这些独立的传感器可以用来取代 ArduPilot 中已经存在的那些设备温度报告。它们也可以只是被记录下来。 ArduP…...

【靶场实操】sql-labs通关详解----第二节:前端页面相关(Less-11-Less-17)

SQL注入攻击是一种针对Web应用程序的安全漏洞&#xff0c;那么自然&#xff0c;SQL注入攻击也和前端页面息息相关&#xff0c;用户输入未被正确处理、动态查询的构建、前端JavaScript代码错误&#xff0c;等等我问题都可能造成安全威胁。 在上一节&#xff0c;我们了解了基础的…...

样式与特效(2)——新闻列表

1.盒子模型的边距概念 ) Margin-top 上面 Margin-bottom 底部 Margin-right 右边 Margin-left 左边 Margin : 10px &#xff08;上下左右都是10px&#xff09; Margin &#xff1a;10px,20px (上下边距10px 左右20px) CSS里面最重要的属性之一 将页面理解成…...

NICE Seminar(2023-07-16)|演化算法的理论研究到底有什么用?(南京大学钱超教授)

模式定理&#xff08;Schema Theorem&#xff09; 模式定理&#xff08;Schema Theorem&#xff09;是遗传算法&#xff08;Genetic Algorithm, GA&#xff09;的重要理论基础&#xff0c;由约翰霍兰德&#xff08;John Holland&#xff09;在1975年提出。它描述了具有特定模式…...

优盘驱动器未格式化?数据恢复全攻略

在数字时代&#xff0c;优盘作为便携的数据存储工具&#xff0c;广泛应用于日常生活与工作中。然而&#xff0c;当遇到“优盘驱动器未被格式化”的提示时&#xff0c;无疑给许多人带来了不小的困扰。这一状况往往意味着优盘的文件系统出现了问题&#xff0c;导致系统无法正确识…...

从用户需求看b2b网站的营销策略/福州百度推广电话

7.1 HBase与Hive的对比 1.Hive (1) 数据分析工具 Hive的本质其实就相当于将HDFS中已经存储的文件在Mysql中做了一个双射关系&#xff0c;以方便使用HQL去管理查询。 (2) 用于数据分析、清洗 Hive适用于离线的数据分析和清洗&#xff0c;延迟较高。 (3) 基于HDFS、MapReduce Hi…...

东莞网站建设基本流程/网站提交入口百度

今天看别人的SQL时看这里面还有decode&#xff08;&#xff09;函数&#xff0c;以前从来没接触到&#xff0c;上网查了一下&#xff0c;还挺好用的一个函数&#xff0c;写下来希望对朋友们有帮助哈&#xff01;decode()函数简介&#xff1a; 主要作用&#xff1a;将查询结果翻…...

wordpress 企业沟通插件/百度发布平台官网

今天我们用Python来实现一个投骰子小游戏&#xff0c;这个小游戏比之前写的要复杂一点点&#xff0c;不过大家不用担心&#xff0c;只要大家掌握了基本的语句就可以写出来了 游戏具体内容如下&#xff1a; #投骰子 #玩两个骰子 &#xff1a; 1-6 #1.玩游戏要有金币 #2.玩游戏赠…...

做夏促的网站有哪些/推广网站怎么制作

目录 实施 实施步骤概览 实施步骤 原理 经验之谈&#xff1a; 可以控制发包行为&#xff0c;所以tc也可作为生成测试数据的工具&#xff1a;https://blog.csdn.net/bandaoyu/article/details/115673475 一、实施 原文&#xff1a;https://blog.csdn.net/tycoon1988/arti…...

一个电子商务网站的用户购买行为监测报告文档格式怎么做?/开封seo公司

取消PHPStorm注释斜体&#xff1a; 可能有的看不太明白&#xff0c;补充下&#xff1a; 进入setting->Editor->Colors & Fonts->Language Deafaults&#xff1b; 找到右边的Comments->Doc Comment->Text 取消掉右边的Italic复选框即可。...

莲湖免费做网站/各大网站提交入口

go语言异步与Java异步 一、概要 go语言异步&#xff0c;由于后来者居上&#xff0c;异步和异步处理都和容易。Java 异步相对比较臃肿一点&#xff0c;也不是太好控制。具体参考如下分析 二、golang异步 1&#xff09; goroutine方式&#xff1a; 代码块 go func()2&#xf…...