Browse Source

进制转换记录

kindring 3 years ago
parent
commit
b8f56a3025

+ 5 - 2
js/js奇怪技巧.md → js/小问题解决方案.md

@@ -1,5 +1,8 @@
-# js中的奇怪技巧
+# js中各种小问题解决方案
+> [!tip]
+> 厚颜无耻的
 ## 利用隐式类型转换
     1. 字符串数字转 数字类型
        1. 使用 `+0` 的方式进行自动类型转换
-        > 可以直接省略 + 0 可以在表达式前面直接使用 +号 如 ` +variable ` 等同于 ` toNumber(Variable) `
+        > 可以直接省略 + 0 可以在表达式前面直接使用 +号 如 ` +variable ` 等同于 ` toNumber(Variable) `
+##

+ 6 - 0
js/数组使用案例.md

@@ -0,0 +1,6 @@
+# 数组使用案例
+> [!tip]
+> 拿了大佬的代码就是我自己的了,我不管
+> 记录一下`array`相关函数的使用与实现需求的技巧代码
+## `reduce`相关
+### 使用reduce

+ 25 - 0
js/进制转换采坑.md

@@ -0,0 +1,25 @@
+# 在`javaScript`中进制转换
+## 1. 前言
+1. **问题描述**
+  在某次使用js操作`innfos`机器人时,使用`udp`进行连接后需要发送机械臂位置实现位置控制,`innfos`使用16进制编码进行通信.数据需要转换为32位进行发送。
+  初始方案使用js自带的函数进行类型转换,将计算结果直接进行`toString`操作,传入参数`16`告诉转换为16进制值,直接使用`toString`函数转换成的`hex`进制字符串会出现一些问题.印象比较深刻的问题是转换数值小于16的值时会出现首字为0情况下自动忽略0. 需要手动在前方进行添加 0 
+```javaScript
+// 比如要转换的值为15时,会返回F 但是进行通信需要的数据为 0F 
+(15).toString(16);// F
+
+```
+  该方法转换正整数时可以正常工作,但是转换负整数时无法正常工作.当时排查了很久,后面发现是该方法转换负整数时转换为了有符号数,会在数据前方添加一个负数符号即`-`。当时想的是直接移除负号,但是效果根本不行,移除负号就是正数了。当时找了许久。并没有直接找到方案
+```javascript
+//比如 -987654 转换为16进制 "-f1206"
+(-987654).toString(16)//> "-f1206"
+```
+2. **解决思路**
+  首先得清楚为什么会这样,在js中使用的是有32位符号数,当时我用`win`计算器应该是64位的,找出了一些规律.但是我要通信的对象使用的是32位无符号数,尝试使用`win`的计算器生成的16进制值发送是可行的.于是问题变为了在js中如何生成32位无符号16进制数了.
+> [!tip]
+> 此处需要了解一下 [计算机补码@张子秋](https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html) ,从搜索引擎直接搜索的看着有点蒙逼,这个博文的看着要稍微舒服一点. 字体清晰一点
+
+  根据我的粗俗理解,缝合一下理论就是,无符号数将会在数据前面用一位来专门表示正数还是负数.所以`n`位的无符号数能表示的最大正整数值`y`为 
+$y=2^n/2-1$
+根据该公式发现无符号数的最大值只有位数的一半还要少1。有一半空间用来存储负整数。
+
+

+ 0 - 2
js中的那些破坑/类型转换.md

@@ -1,2 +0,0 @@
-# js类型转换问题
-<!-- 如何正确的获取16进制值 -->

+ 41 - 0
test/test.js

@@ -0,0 +1,41 @@
+// 雷姆提问,如何将两个数组中key值同样的项合并
+const arr = [
+    {key: 1, a: 'a'},
+    {key: 1, b: 'b'},
+    {key: 2, a: 'a'},
+    {key: 2, b: 'b', c: 'c'},
+    {key: 3, a: 'a', b: 'b'},
+    {key: 4, a: 'a', b: 'b'},
+]
+
+const arr_res = [
+    {key: 1, a: 'a', b: 'b'},
+    {key: 2, a: 'a', b: 'b', c: 'c'},
+    {key: 3, a: 'a', b: 'b'},
+    {key: 4, a: 'a', b: 'b'},
+]
+// 湿鸡版本
+var obj = arr.reduce((_,o)=>{
+    _[o.key] ? (_[o.key] = Object.assign(_[o.key],o)) : (_[o.key] = o);return _;
+},{})
+
+var a = [];
+for( var key in obj ){
+    a.push(obj[key])
+}
+
+console.log(a);
+
+
+// 晨晨版本
+const map = new Map()
+let crt
+for (const item of arr) {
+    crt = map.get(item.key)
+    map.set(item.key, {...crt, ...item})
+}
+const res = [...map.values()]
+console.log(res)
+
+// 晨晨的一行版本
+arr.reduce((r, o) => ((r[o.key] = {...r[o.key], ...o}), r), []).filter(i => i)