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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

4161閲覧

QRコード(QRCodeEncoderクラス)についての質問です。

Pay

総合スコア2

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/11/07 01:11

編集2020/11/07 01:32

QRコード(QRCodeEncoderクラス)についての質問です。

C#

1    var enCodeString = this.GetQRString(); 2 // QR画像を作成する。 3 var qrEncoder = new QRCodeEncoder(); 4 qrEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE; 5 qrEncoder.QRCodeScale = 10; 6 qrEncoder.QRCodeVersion = 10; 7 qrEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M; 8 qrEncoder.QRCodeBackgroundColor = Color.Black; 9 qrEncoder.QRCodeForegroundColor = Color.White; 10 11 12 13 var bt = qrEncoder.Encode(enCodeString, Encoding.UTF8);

上記で(,,英数字16桁,英数字25桁,数字5桁,数字5桁,数字5桁,数字5桁,英数字10桁,英数字15桁,英数字10桁,英数字15桁)

の内容をQRコード内にっか右脳したく思っていて

デンソーウェーブ公式サイト内の混合のビット数を計算したところ
英数字16桁 4+9+118+0 = 101
数字5桁   4+10+10
1+7 =31

の様に計算した所 合計704ビット計算になり

エラー補正Mのバージョン6で表示できる見込みでソースを書いていたのですが

Indexが配列の境界線買いというエラーがでて表示されない原因がわからないです。

イメージ説明

エラー行数は上記コードの.Encode部です

version = 10 では表示できます

またversion = 0 でも表示されるのですが バージョンは1~40ではないのでしょうか?

調べてはみたもののなかなかわからず皆さまの知識を借りたく思います、ご回答いただきたく思います。

また混合計算時のバイナリー項目についてもなにかわかっておりません

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

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

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

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

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

y_waiwai

2020/11/07 01:18

エラーメッセージを、いらぬ翻訳省略しないで、コピペでそのままの形で提示しましょう
Pay

2020/11/07 01:33

失礼しました、ただいま更新いたしました。 拝見いただければと思います。
YAmaGNZ

2020/11/07 01:58

エンコードするデータは例えば string encodestring = "(,,AAAAAAAAAAAAAAAA,BBBBBBBBBBBBBBBBBBBBBBBB,00000,00000,00000,00000,CCCCCCCCCC,DDDDDDDDDDDDDDD,EEEEEEEEEE,FFFFFFFFFFFFFFF)"; このようになるのですか? そうなのであれば、カンマとかは計算に含まれていますか?
Pay

2020/11/07 02:07

YAmaGNZさん そのような形になります、カンマは計算内に入っておりません。 カンマ計算の際は英数字バイトで計算すれば良いのでしょうか。 質問ばかりで申し訳ありませんが、ご回答いただければと思います。
YAmaGNZ

2020/11/07 02:31

私も詳しくないのでデンソーのページを読んだだけでの話なのですが エンコードするデータを数字、英数字と分けるとすると 英数字46文字 ”(,,AAAAAAAAAAAAAAAA,BBBBBBBBBBBBBBBBBBBBBBBB,” 数字5桁 00000 英数字1文字 , 数字5桁 00000 英数字1文字 , 数字5桁 00000 といった感じで計算しなければならないのではないでしょうか? このように計算するのであれば、普通に全体を英数字123文字として計算したほうがいいのではないかと思います。
Pay

2020/11/07 02:35

追加ご回答ありがとうございます。 データの中身に関しまして漢字が含まれる可能性が有ります。 漢字のビット数が8*桁数で、英数字の方がビット数が大きいので英数字で計算した次第です。 なので英数字123文字にはならない可能性が有ります。
YAmaGNZ

2020/11/07 02:40

提示されたものが123文字だったのでそう書いただけです。 なので、考えられる最大値で計算すればいいのではないですか? ただ、カンマ区切りのデータなので各項目を英数字、数字と分けて考えるのではなく、全体ひとまとめの方が考えやすいのではないかと思っただけです。
YAmaGNZ

2020/11/07 02:58

ちなみに、QRCodeEncodeModeをALPHA_NUMERICにして string encodestring = "(,,AAAAAAAAAAAAAAAA,BBBBBBBBBBBBBBBBBBBBBBBB,00000,00000,00000,00000,CCCCCCCCCC,DDDDDDDDDDDDDDD,EEEEEEEEEE,FFFFFFFFFFFFFFF)"; このデータをQRCodeVersion = 6でエンコードできましたよ
guest

回答1

0

ベストアンサー

ライブラリ(Open Source QRCode Library)の動作を確認してみましたが
QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE
とByteモードを指定した場合、
QRコード情報量とバージョンのバージョン一覧の表の「バイナリ」のサイズとなります。
なので、誤り訂正レベルがMでレベルが6の場合は106バイトまでとなります。
この為、入力データが123バイトとなるのでエラーが発生します。

エンコードモードは下記の3種しか定義がありません。

MODE文字種
ENCODE_MODE.ALPHA_NUMERIC英数字
ENCODE_MODE.BYTEバイナリ
ENCODE_MODE.NUMERIC数字

なのでデンソーのページのような混合データの考え方自体がなさそうです。

今回の提示データであれば、文字として考えALPHA_NUMERICを指定し、123文字なので誤り訂正レベルがMでレベルが6でおさまるでしょう。
ただ全角文字があるとのことなので、UTF8エンコードは英数字3文字として考えて最大サイズを求めて
レベルがいくつまでとなるのかを求める形になるのではないでしょうか。

すみません、QRコードの仕様を詳しく理解していないので分かりませんが、ALPHA_NUMERICを設定した時にUTF8の全角文字を指定した時に何かしらのデータビットの欠落が起こるのではないかと考えました。
なので全角文字を含む場合はバイナリでサイズを考えた方がいいかもしれません。

投稿2020/11/07 03:23

編集2020/11/07 03:38
YAmaGNZ

総合スコア10489

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

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

Pay

2020/11/07 04:14

YAmaGNZさん ご回答ありがとうございます。 ENCODE_MODE.BYTE指定で utf-8の全角文字は通常3BYTEいないなので全角文字が入る項目は3BYTE計算 で値を求めるという事ですね。 自分もQRの知識がなくよくわからない質問をしてしまい申し訳ありませんでした。 少し試してみます。 また今回のソースは qrEncoder.QRCodeVersion = 10; で指定しているのですがこれが qrEncoder.QRCodeVersion = 0; にした場合エラーが起こらなくなります。 これはバイナリ数に合わせて自動」でバージョンの変更を行っている ということなのでしょうか。 ここの理屈を知っていましたら兼ねてお伺いしたく思います。
YAmaGNZ

2020/11/07 04:46

ダウンロードしたものの中にあるソースを見たところ、プロパティの値として0は許容していて、0指定時は自動バージョン選択を行っているようです。
Pay

2020/11/07 07:49

ご丁寧な説明いただきありがとうございます。 そこまで解析する技術が自分にはなく 検索してもヒットせず困っておりました。 またビット数換算で、バージョンを選択しなおした後 エラーが消えました。 ご対応、ご教授いただきありがとうございました。 またご縁がありましたら教えていただけると嬉しく思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問