センサーやネットワーク データなどの外部形式のデータでは、ある基数または基数から別の基数または基数への値の変換が必要になることがよくあります。 JMPを使用した 16 進数から 10 進数への変換、およびその逆の変換をサポートしました。 16進数そして16 進数から数値へ機能。 例えば:
decimalToHex = Hex(1234, “integer”);
show(decimalToHex);
backToDecimal = HexToNumber(decimalToHex);
show(backToDecimal);
出力:
decimalToHex = "000004D2";
backToDecimal = 1234;
しかし、バイナリまたは 8 進データがある場合はどうなるでしょうか?
もはやヘックスだけではない
とJMP15 、これらの関数は、2 ~ 36 の任意の基数をサポートするように拡張されました。 を指定することで、ベースのオプション16進数関数を使用すると、10 進数はデフォルトの基数 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"
16 進数から数値へは、次の場合に逆の機能を提供します。ベースオプションが指定されています。
2 進数から 10 進数に変換します。
binaryToDec = Hex To Number("10011010010", Base(2));
show(binaryToDec);
octalToDec = Hex To Number("2322", Base(8));
show(octalToDec);
出力:
binaryToDec = 1234;
octalToDec = 1234;
QRコード
QR コード (クイック レスポンス コード) は、スキャナまたはスマートフォンを使用して読み取ることができる少量のバイナリ データを保存した 2 次元バーコードです。 これらのコードは在庫追跡用に開発されましたが、現在では Web サイトやアプリケーションの位置データをエンコードするためによく使用されています。 たとえば、これはツーソンで開催される JMP Discovery Summit の QR コードで、カンファレンスのメイン Web ページにリンクしています。
QR Code for Discovery Summit Tucson 2019QR Code for Discovery Summit Tucson 2019QR Code for Discovery Summit Tucson 2019QR Code for Discovery Summit Tucson 2019Discovery Summit Tucson 2019 の QR コード
QR コードは、いくつかの固定パターン (位置合わせ用の 3 つの大きな正方形のブロックなど) と、データのセル/コンテンツ領域とエラー検出/修正情報で構成されます。 QR コードにはさまざまなサイズがあり、エラー訂正のレベルもさまざまです。 この演習では、これらの詳細は重要ではありません。
URL をエンコードしたいと考えてみましょう。ディスカバリー サミット ツーソン 2019 QRコードに必要なビットに変換します。
URL から始めることができます。
https://discoverysummit.jmp/en/2019/usa/home.html
QR コードは、数値、英数字、バイト、漢字の 4 種類のエンコードをサポートしています。 URL は文字、数字、記号の組み合わせであるため、英数字エンコーディングを使用できます。 英数字コーディングでは大文字のみがサポートされますが、URL では大文字と小文字が区別されないため、問題ありません。
残念ながら、文字の QR エンコードは ASCII 値だけではありません。 もしそうなら、私たちはただそれを使うことができます16進数エンコーディングを取得する関数。 代わりに、以下の表に基づいて変換を行う短い JSL 関数を作成します。
手紙
|
コード
|
アスキー
|
手紙
|
コード
|
アスキー
|
手紙
|
コード
|
アスキー
|
|---|
0
|
0
|
48
|
F
|
15
|
70
|
U
|
30
|
85
|
1
|
1
|
49
|
G
|
16
|
71
|
V
|
31
|
86
|
2
|
2
|
50
|
H
|
17
|
72
|
W
|
32
|
87
|
3
|
3
|
51
|
私
|
18
|
73
|
バツ
|
33
|
88
|
4
|
4
|
52
|
J
|
19
|
74
|
Y
|
34
|
89
|
5
|
5
|
53
|
K
|
20
|
75
|
Z
|
35
|
90
|
6
|
6
|
54
|
L
|
21
|
76
|
空間
|
36
|
32
|
7
|
7
|
55
|
M
|
22
|
77
|
$
|
37
|
36
|
8
|
8
|
56
|
N
|
23
|
78
|
%
|
38
|
37
|
9
|
9
|
57
|
○
|
24
|
79
|
*
|
39
|
42
|
あ
|
10
|
65
|
P
|
25
|
80
|
+
|
40
|
43
|
B
|
11
|
66
|
Q
|
26
|
81
|
-
|
41
|
45
|
C
|
12
|
67
|
R
|
27
|
82
|
。
|
42
|
46
|
D
|
13
|
68
|
S
|
28
|
83
|
/
|
43
|
47
|
E
|
14
|
69
|
T
|
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 の値にマッピングされます。 シンボルは飛び回っているため、ほとんどは個別に処理されます。
スペースを節約するために、QR コードはエンコードされた値を直接書き込みません。 文字列を文字のペアに分割します。 URL の場合、次のようになります。
ht tps: // ディスカッション ysum mi t. jm p/ en /2 01 9/ us a/ home .h tm l
文字のペアごとに、最初の文字のエンコードされた値が 45 倍され、2 番目の文字のエンコードされた値に加算されます。
私たちの最初のペアは「ht」 :
H = 17
T = 29
結果は、17 * 45 + 29 = 794 となります。 次に、これは 11 ビットのバイナリ値に変換され、必要に応じてゼロが埋め込まれます。
749 = 01011101101
今回の場合のように、文字の数が奇数の場合は、最後の文字だけがエンコードされ、6 ビットのバイナリ値に変換されます。 私たちの場合、単一の「l」最後に。
L = 21
21 = 010101
数値をバイナリに変換し、パディングを適用することは、まさに16進数今できる機能。 まず、文字のペアのエンコードされた数値を計算する関数を作成しましょう。
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 から 2 文字が取得されます。のためにループし、そのペアに基づいて英数字エンコーディングが計算されます。 の16進数関数は数値をバイナリ表現に変換します。 値は、文字が 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 コードの最終出力の作成には、エンコード モード、文字数インジケーター、エラー訂正コーディングなど、さらに多くの作業が必要になります。 新機能を紹介するにはこれだけでは十分ではありません。 これが新しい機能のいくつかを説明するのに役立つことを願っています16進数そして16 進数から数値へ特徴とその応用方法。