對於外部格式的資料(例如感測器或網路資料),通常需要將值從一種基數或基數轉換為另一種基數或基數。 聯合管理計劃支援使用以下命令從十六進制轉換為十進制並返回十六進位和十六進位轉數字功能。 例如:
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 圖碼
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 碼的最終輸出還有很多內容,例如編碼模式、字元計數指示器和糾錯編碼。 這超出了我們展示新功能所需的範圍。 希望這有助於解釋一些新的內容十六進位和十六進位轉數字功能以及如何應用它們。