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

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

ただいまの
回答率

87.34%

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

解決済

回答 5

投稿

  • 評価
  • クリップ 1
  • VIEW 1,353

score 15

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

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桁に変換する方法がおわかりになる方がいらっしゃいましたら、
教えていただけますと助かります。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+4

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/19 23:58 編集

    ご回答ありがとうございます。

    皆さんから教えていただいて、少し理解が進みました。

    キャンセル

+2

全銀プロトコルでのヘキサデシマルは、「二進化十進数」(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/19 23:54

    ご回答ありがとうございます!

    変換にお詳しい方がいらっしゃって助かりました。

    全銀プロトコルでの「ヘキサデシマル」を、
    言葉どおり16進数にするだけと勘違いしておりましたが、
    2文字ずつに取り出して16進数にするものだったのですね。

    こちらでチャレンジしてみます!

    キャンセル

checkベストアンサー

+1

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

mysql> select 0x0311111111;
+--------------+
| 0x0311111111 |
+--------------+
|         |                <== この場合は制御文字なので目に見えない
+--------------+
1 row in set (0.00 sec)

mysql> select length(0x0311111111);
+----------------------+
| length(0x0311111111) |
+----------------------+
|                    5 |
+----------------------+
1 row in set (0.00 sec)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/19 07:08

    ご回答ありがとうございます。

    16進数への変換が簡単にできるのでmysqlをつかいましたが、
    おっしゃる通り、mysqlでやるものではないようですね。

    追加で教えていただきたいのですが、

    この目に見えない制御文字を通信に乗せるには、
    この目に見えない文字をプログラムで文字列として取得して加えるイメージで
    あっていますでしょうか。

    キャンセル

  • 2019/07/19 07:12

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

    キャンセル

  • 2019/07/19 08:45

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

    キャンセル

0

Windowsの電卓で、

0311111111

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/19 08:46

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

    キャンセル

  • 2019/07/19 09:07

    まあ、わざわざXXバイトにする、という記述から、バイナリとしてやり取りするんじゃないかと思いますが、

    #文字列とするならBCDにしようが何も変わりませんから

    そこらへんは仕様書をよく読む必要がありますね

    キャンセル

  • 2019/07/19 23:57

    ご回答ありがとうございます。

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

    キャンセル

0

こちらの116~117ページ目に記載されている内容では、
―――――――――――――――――――――――――――――――――――
1.10桁の電話番号を16進数にする
2.4桁のコードを16進数にする
3.前者が5バイトになり、後者が2バイトになる
―――――――――――――――――――――――――――――――――――
となっていますが、

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る