对于外部格式的数据(例如传感器或网络数据),通常需要将值从一种基数或基数转换为另一种基数或基数。 联合管理计划支持使用以下命令从十六进制转换为十进制并返回十六进制和十六进制转数字功能。 例如:
decimalToHex = Hex(1234, “integer”);
show(decimalToHex);
backToDecimal = HexToNumber(decimalToHex);
show(backToDecimal);
输出:
decimalToHex = "000004D2";
backToDecimal = 1234;
但是如果您有二进制或八进制数据怎么办?
不再只是十六进制
和JMP 15 ,这些函数已扩展为支持从 2 到 36 的任何基数。 通过指定根据上的选项十六进制函数时,十进制数将转换为该基数,而不是默认的基数 16。
decimalToBinary = Hex(1234, Base(2));
show(decimalToBinary);
decimalToOctal = Hex(1234, Base(8));
show(decimalToOctal);
输出:
decimalToBinary = "10011010010";
decimalToOctal = “2322”
通常,对于二进制数据,您希望将值填充到字节边界以保持一致性。 新的垫至选项允许这样做。
填充为 2 字节:
Hex(1234, Base(2), Pad To(16));
"0000010011010010"
填充为 4 字节:
Hex(1234, Base(2), Pad To(32));
"00000000000000000000010011010010"
十六进制转数字提供反向功能时根据选项已指定。
从二进制转换为十进制:
binaryToDec = Hex To Number("10011010010", Base(2));
show(binaryToDec);
octalToDec = Hex To Number("2322", Base(8));
show(octalToDec);
输出:
binaryToDec = 1234;
octalToDec = 1234;
二维码
QR 码(快速响应码)是二维条形码,存储少量二进制数据,可以使用扫描仪或智能手机读取。 这些代码是为库存跟踪而开发的,但现在通常用于对网站或应用程序的位置数据进行编码。 例如,下面是图森 JMP Discovery Summit 的二维码,链接到会议的主页。
QR Code for Discovery Summit Tucson 2019QR Code for Discovery Summit Tucson 2019QR Code for Discovery Summit Tucson 2019QR Code for Discovery Summit Tucson 20192019 年图森探索峰会二维码
QR 码由几个固定图案(例如用于对齐的三个大方块)和数据的单元格/内容区域以及错误检测/纠正信息组成。 QR 码有多种尺寸,并且具有不同级别的纠错能力。 这些细节对于本练习并不重要。
假设您想要对 URL 进行编码2019 年图森探索峰会转换为 QR 码所需的位。
我们可以从 URL 开始:
https://discoverysummit.jmp/en/2019/usa/home.html
QR 码支持四种编码类型:数字、字母数字、字节和汉字。 由于我们的 URL 是字母、数字和符号的组合,因此我们可以使用字母数字编码。 字母数字编码仅支持大写字母,但这没关系,因为 URL 不区分大小写。
不幸的是,字符的 QR 编码不仅仅是 ASCII 值。 如果是的话,我们可以使用十六进制函数来获取编码。 相反,我们将编写一个简短的 JSL 函数来根据下表进行转换。
信
|
代码
|
ASCII码
|
信
|
代码
|
ASCII码
|
信
|
代码
|
ASCII码
|
|---|
0
|
0
|
48
|
F
|
15
|
70
|
U
|
30
|
85
|
1
|
1
|
49
|
G
|
16
|
71
|
V
|
31
|
86
|
2
|
2
|
50
|
H
|
17 号
|
72
|
瓦
|
32
|
87
|
3
|
3
|
51
|
我
|
18
|
73
|
X
|
33
|
88
|
4
|
4
|
52
|
J
|
19
|
74
|
是
|
34
|
89
|
5
|
5
|
53
|
K
|
20
|
75
|
Z
|
35
|
90
|
6
|
6
|
54
|
L
|
21
|
76
|
空间
|
36
|
32
|
7
|
7
|
55
|
中号
|
22
|
77
|
$
|
37
|
36
|
8
|
8
|
56
|
氮
|
23
|
78
|
%
|
38
|
37
|
9
|
9
|
57
|
氧
|
24
|
79
|
*
|
39
|
42
|
A
|
10
|
65
|
磷
|
25
|
80
|
+
|
40
|
43
|
乙
|
11
|
66
|
问
|
26
|
81
|
-
|
41
|
45
|
C
|
12
|
67
|
右
|
27
|
82
|
。
|
42
|
46
|
D
|
13
|
68
|
S
|
28
|
83
|
/
|
43
|
47
|
乙
|
14
|
69
|
时间
|
29
|
84
|
:
|
44
|
58
|
下面是 JSL 函数,用于将字符转换为字母数字编码值。
encodeAlpha = Function( {ch},
// Convert character to its ASCII number value.
hexVal = Hex To Number(Hex(ch));
// Map the ASCII value to the QR encoded value.
If(hexVal >= 48 & hexVal <= 57, hexVal - 48, // 0-9
hexVal >= 65 & hexVal <= 90, hexVal - 55, // A-Z
hexVal >= 97 & hexVal <= 122, hexVal - 87,// a-z
hexVal == 32, 36, //Space
hexVal >= 36 & hexVal <= 37, hexVal + 1, // $ %
hexVal >= 42 & hexVal <= 43, hexVal - 3, // * +
hexVal >= 45 & hexVal <= 47, hexVal - 4, // - . /
hexVal == 58, 44, // :
0;
);
);
这如果语句使用范围将 ASCII 值映射到编码值。 例如,字符0-9是ASCII 48-57,编码为0-9。 因此,这些可以通过简单地减去 48 来从 ASCII 转换。 AZ 和 az 有类似的范围。 小写 az 映射到大写 AZ 的值。 这些符号会跳来跳去,因此大多数都是单独处理的。
为了节省空间,二维码不会直接写出编码值。 它将字符串分成字符对。 对于我们的 URL,它看起来像这样:
ht tp s: // 发现 ys um mi t。 jm p/ en /2 01 9/ us a/ ho me .h tm l
对于每对字符,第一个字符的编码值乘以 45,并添加到第二个字符的编码值中。
我们的第一对是'H T' :
高=17
时间=29
结果是 17 * 45 + 29 = 794。 然后将其转换为 11 位二进制值,必要时用零填充。
749 = 01011101101
如果有奇数个字符(如我们的例子),则仅对最后一个字符进行编码并转换为 6 位二进制值。 在我们的例子中,我们有一个'l'在最后。
长=21
21 = 010101
将数字转换为二进制并应用填充正是十六进制功能现在可以做。 让我们首先编写一个函数来计算一对字符的编码数。
encodePair = Function ( {pair},
char1 = Substr(pair, 1, 1);
char2 = Substr(pair, 2, 1);
encode1 = If(Length(pair) == 1, 0, encodeAlpha(char1));
encode2 = If(Length(pair) == 1, encodeAlpha(char1),
encodeAlpha(char2));
encode1 * 45 + encode2;
);
现在我们可以对 URL 中的每一对进行编码,以创建 QR 码的数据。
qrData = "";
For( i = 1, i <= Length( url ), i = i + 2,
charPair = Substr( url, i, 2 );
encodedValue = encodePair(charPair);
asBinary = If(Length(charPair) == 1,
Hex(encodedValue, Base( 2 ), Pad To (6)),
Hex(encodedValue, Base( 2 ), Pad To (11));
);
qrData = qrData || asBinary || " ";
);
show(qrData);
在此 JSL 中,每次传递时都会从 URL 中获取两个字符为了循环并根据该对计算字母数字编码。 这十六进制函数将数字转换为其二进制表示形式。 根据是否有 1 个或 2 个字符,将该值填充为 11 位或 6 位。 二进制值附加到先前的值。 我们在各对之间添加了一个空格,以使输出更易于阅读。 该空格不会包含在实际的 QR 数据中。
以下是 URL 的结果:
qrData = "01100011010 10100110010 10100011000 11110111010 01001011011 10011111000 10001010111 01010010001 11000010110 10101011100 01111110000 10101000011 01101101101 10010010000 01010001101 11110010001 00000000001 00111000000 10101100010 00111101101 01100010101 01111101100 11101110011 10100101111 010101 ";
创建 QR 码的最终输出还有很多内容,例如编码模式、字符计数指示器和纠错编码。 这超出了我们展示新功能所需的范围。 希望这有助于解释一些新的内容十六进制和十六进制转数字功能以及如何应用它们。