質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

5回答

1859閲覧

10進数を16進数にした場合の桁数について

Mozart

総合スコア25

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

1グッド

1クリップ

投稿2019/07/18 13:32

現在、全銀協プロトコルという仕組みを勉強しております。

https://www.zenginkyo.or.jp/fileadmin/res/abstract/efforts/system/jba_protocol.pdf

こちらの116~117ページ目に記載されている内容では、

―――――――――――――――――――――――――――――――――――
1.10桁の電話番号を16進数にする
2.4桁のコードを16進数にする
3.前者が5バイトになり、後者が2バイトになる
―――――――――――――――――――――――――――――――――――

となっていますが、
mysqlで、
select hex(0311111111);
と電話番号の桁を入れてコマンドを打つと、それだけで8バイトが出力されてしまいます。

おそらく、PDF資料には間違いないのではないかと思いますので、
ヘキサデシマルの作り方が間違っているような気がしております。

どなたか、記載のURLにある資料の通り5桁に変換する方法がおわかりになる方がいらっしゃいましたら、
教えていただけますと助かります。

hentaiman👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

単純に 10桁の数字列(電話番号)を Hexコードとみなせば、 5桁の文字列(バイト列)になりませんか?
(10進数 2文字 --> Hex 1byte)

投稿2019/07/18 13:47

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mozart

2019/07/19 14:58 編集

ご回答ありがとうございます。 皆さんから教えていただいて、少し理解が進みました。
guest

0

全銀プロトコルでのヘキサデシマルは、「二進化十進数」(BCD)と呼ばれる形式で、10進数の一桁を4ビットで表す(1バイトで二桁を入れる)形式です。(より正確には符号ビットのないパックドBCDですかね)

つまり
「01234567」とあったら、
「01 23 45 67」という4バイトになる、というものです。
(A~F は使用しない)

変換するには、

  1. 10進数の数値を「そのまま」文字列にする。このとき所用桁数に満たない場合はフォーマット規定に従って右詰・左詰などを行う(01234567 → '01234567')
  2. 得られた文字列の先頭から2文字ずつを取り出して、その2文字を16進数に変換する

※'01' → 0x01 と変換する。これを文字列の最後までくり返す

といった形で行うことになります。

※もともと COBOL 前提で書かれているんですよね……

投稿2019/07/18 23:52

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mozart

2019/07/19 14:54

ご回答ありがとうございます! 変換にお詳しい方がいらっしゃって助かりました。 全銀プロトコルでの「ヘキサデシマル」を、 言葉どおり16進数にするだけと勘違いしておりましたが、 2文字ずつに取り出して16進数にするものだったのですね。 こちらでチャレンジしてみます!
guest

0

ベストアンサー

変換をMySQLでやるものでは無いと思いますが。

MySQL

1mysql> select 0x0311111111; 2+--------------+ 3| 0x0311111111 | 4+--------------+ 5| | <== この場合は制御文字なので目に見えない 6+--------------+ 71 row in set (0.00 sec) 8 9mysql> select length(0x0311111111); 10+----------------------+ 11| length(0x0311111111) | 12+----------------------+ 13| 5 | 14+----------------------+ 151 row in set (0.00 sec)

投稿2019/07/18 14:16

otn

総合スコア84421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mozart

2019/07/18 22:08

ご回答ありがとうございます。 16進数への変換が簡単にできるのでmysqlをつかいましたが、 おっしゃる通り、mysqlでやるものではないようですね。 追加で教えていただきたいのですが、 この目に見えない制御文字を通信に乗せるには、 この目に見えない文字をプログラムで文字列として取得して加えるイメージで あっていますでしょうか。
otn

2019/07/18 22:12

そうですね。通信する場合は、目に見えるかどうかは関係ないので、変換したものをそのまま送ります。
Mozart

2019/07/18 23:45

ご回答ありがとうございます。 それで実施してみたいと思います!
guest

0

Windowsの電卓で、

0311111111

をいれると、
HEX 128B 2DC7
となります
4バイトになってますね

投稿2019/07/18 14:01

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mozart

2019/07/18 22:04

ご回答ありがとうございます。 追加で教えていただきたいのですが、 いただいた文字列=『128B2DC7』を、そのまま文字列としてバイト計算すると 8倍とになってしまうのですが、これを4バイトとするためにはどのようにすれば良いでしょうか。
y_waiwai

2019/07/18 22:15

文字列とする必要があるならそうなってしまいますね。 バイナリとして送るならそのまま4バイトです
Mozart

2019/07/18 23:46

ご回答ありがとうございます。 バイナリで扱うと4バイトなのですね。 調べてみたいと思います。
y_waiwai

2019/07/19 00:07

まあ、わざわざXXバイトにする、という記述から、バイナリとしてやり取りするんじゃないかと思いますが、 #文字列とするならBCDにしようが何も変わりませんから そこらへんは仕様書をよく読む必要がありますね
Mozart

2019/07/19 14:57

ご回答ありがとうございます。 仕様では、ヘキサデシマル、バイナリ、キャラクタが指定されていまして、 該当箇所はヘキサデシマルとなっていまいましたので、 単純に16進数にこだわってしまいました。
guest

0

こちらの116~117ページ目に記載されている内容では、

―――――――――――――――――――――――――――――――――――
1.10桁の電話番号を16進数にする
2.4桁のコードを16進数にする
3.前者が5バイトになり、後者が2バイトになる
―――――――――――――――――――――――――――――――――――
となっていますが、

なっていません。記載されている内容と自己流の解釈は区別して書いてください。
「10桁のエリアを用意し、右詰めにセット」と書かれており、「を16進数にする」といった変換については書かれていません。
例の「0 031234567」から分かるように、16進数への変換は行われていません。tacsheavenさんの言うとおり、二進化十進数のようです。

投稿2019/07/19 00:32

編集2019/07/19 00:36
ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問