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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2617閲覧

数値をビットに直して圧縮したい

yokatone

総合スコア43

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/10/11 07:21

前提・実現したいこと

Aという送信機、Bという受信機があるとして、

Aにおいて生成した
「11921002」などの数字(ASCII)を2進数にして、(101101011110011001101010)
これを8bit区切りでバイト文字列にして(00000101 1010111 1001100 1101010)
ASCIIに戻して、(0x05 0x57 0x4C 0x6A ですかね?) 8byteを4byteに縮め

Aから受信したBでは
受け取ったデータ(0x05 0x57 0x4C 0x6A)を2進数に戻して(00000101 1010111 1001100 1101010)
これを連結して(101101011110011001101010)、10進数に戻す(11921002)

というロジックを組もうかと考えていますが、
まずこの考え方におかしなところはないでしょうか?

次に、A側をC、B側をPython|PHP(描きやすい方)で記述しようと考えております。
これを行う方法として、実際の実装方法や、ライブラリをご存知であれば教えてください。

また、個人的に探していましたがCにて2進数(文字列)を16進に変換する関数を見つけきれなかったので
特にこれをご存知の方がおられたら教えてください。

該当のソースコード

https://algorithm.joho.info/programming/c-decimal-binary/
のint2binのfor(i=31)for(i=7)
https://edu.clipper.co.jp/pg-2-42.html
のfor部分を%8にして8文字区切りとして、
2進数(文字列)を16進に変換する関数を見つけ切れませんでしたが、これを行って
strcatなどで16進数(char)を一文字ずつ送信メッセージに追記
完成したメッセージを送信

受信したらメッセージを1文字ずつ16進数->2進数に変換し
変換し終わった2進数(文字列)を結合、
結合した2進数をPythonならfromBinaryToInt、PHPならbindecでデコード

というソース・フローで実現可能かなと思っています。
勝手に引用していいものか判断しかねたので、詳細はお手数をおかけしますがURL先でお願いします。

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

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

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

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

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

fuzzball

2018/10/11 07:36

何をしようとしているのか意味が分かりません。
cateye

2018/10/11 07:56

“11921002”がなぜ“101101011110011001101010”に成るのかがわからないのですが?'0'=00110000, '1'=00110001
pepperleaf

2018/10/11 12:22

2進化10進数 BCDとかではダメ? 質問での変換ルールも良く分からないのですが、、、。
guest

回答2

0

ベストアンサー

「8bit区切りでバイト文字列」としてと書かれていますが、7bit の文字列になっているような?
これが誤りで、実際には 8bit の文字列とするのであればロジックは間違いではないと思います。

しかしながら、この場合には、11921002 を直接16進数に変換しない理由はありますか?
「ASCIIに戻して」と書かれていますが、これは要するに2進数→16進数に変換しているだけですよね?
10進を16進であれば、 sprintf(hex, "%x", dec); のような形で変換できるかと思います。

数値が巨大になる場合は、適切な桁数で分ければ対応も可能だと思います。

投稿2018/10/11 07:39

ssasaki

総合スコア1167

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

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

yokatone

2018/10/11 15:57

ありがとうございます。確かにその通りでした。。 文字数ばかりに気を取られて、「255」(3byte)=>「FF」(2byte)=>「11111111」(1byte) とか思っていたのですが、「0xFF」 = 「1111 1111」で等しく1byteでしたね..... 「11921002」=>「B5E66A」=>「0xB5 0xE6 0x6A」ですね。 教えていただいた方法を参考に、10進=>16進で対応します。ありがとうございました。
guest

0

「11921002」などの数字(ASCII)を2進数にして、(101101011110011001101010)

これを8bit区切りでバイト文字列にして(00000101 1010111 1001100 1101010)

7ビット区切りになってます
11921002 の数値なら3バイトに収まりますぜ

2進数というのは16進数と同じものです。


で、数値をこういうふうに最小バイト数にするのはいいけど、その数値は何バイトか、という情報はどうやって伝えますか?

投稿2018/10/11 07:30

編集2018/10/11 07:32
y_waiwai

総合スコア87774

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

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

yokatone

2018/10/11 16:02

確かに!うーん。規則として4byteを固定長として、足りないビットは0埋め...しかないですね、結局。 「1213」=>「4BD」=>「0x04 0xBD」=>「0x00 0x00 0x04 0xBD」 色々と考えの参考になりました!ありがとうございます。
y_waiwai

2018/10/11 22:21

ふつーにintの変数に代入してるだけですやん。 それをバイナリで転送するだけ、ということでなんの圧縮にもなってませんぜ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問