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

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

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

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

C

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

3287閲覧

8bitの動的配列のメモリに代入された12bitの数値を読み取りたい

plei

総合スコア11

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

C

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/06/18 15:06

前提・実現したいこと

C++の共有ライブラリで8bitの動的配列に12bitの数値を返す関数を使用しています.
この関数が返す配列から12bitの数値を読み取りたいです.

下記の例で、pFrameのメモリからbit単位で数値を読み込むことができれば助かります

該当のソースコード

C++

1#include "stdafx.h" 2#include "stdint.h" 3#include "stdlib.h" 4 5int main() 6{ 7//配列の宣言 8int SizeInBytes; //SizeInBytesには適当な数値が代入される 9uint8_t *pFrame; 10pFrame = (uint8_t *)malloc(SizeInBytes); 11 12//C++の共有ライブラリ関数: Func_12bit(uint8_t *pFrame) 13//Func_12bitは12bitの数値を返します 14Func_12bit(pFrame); 15 16//以下、詳細は省いて流れだけ書きます 17//1) pFrame[i]を8桁の2進数への変換し、各要素をつなげる 18//2) 変換した2進数を12桁づつに分割 19//3) 12桁の2進数を10進数に変換 20 21return 0; 22} 23 24省略部分の例を簡単に挙げますと 25pFrame[0] = 68 (= 01000100) 26pFrame[1] = 200 (= 11001000) 27pFrame[2] = 14 (= 00001110) 28の場合、 29010001001100100000001110に結合・分割して 30それぞれ11002062という数値を得ています.

発生している問題・試したこと

上記のコードで、pFrame[i]は8bit(<256)の数値を返すので
いったん配列内の数値を8桁の2進数に変換し、12桁づつに分割してから10進数に変換し直しています.
この方法で正しい数値は得られるのですが、可能であれば2進数の変換を経ないで直接pFrameから12bitごとに数値を出力したいです.

補足情報

OSはCentOS7です
使用している関数(Func_12bit)は共有ライブラリ(.soファイル)となっており、関数自体は変更できないので数値の出力方法を工夫したいです.

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

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

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

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

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

guest

回答2

0

text

1usr ~/Project/test % ./a.out 2ans = 1100 3usr ~/Project/test % cat t1.c 4#include <stdio.h> 5 6int main(void) 7{ 8 unsigned char pFrame[] = { 68, 200, 14}; 9 int ans = pFrame[0] << 4 | ((pFrame[1] >> 4) & 0x0F); 10 11 printf("ans = %d\n", ans); 12 13 return 0; 14}

投稿2019/06/18 15:28

編集2019/06/18 15:34
cateye

総合スコア6851

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

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

cateye

2019/06/18 15:32

かぶったw unsignedって宣言してるので、& 0x0Fは不要かも。
plei

2019/06/18 16:25

回答ありがとうございます しばらく考えた末の解決策だったのですが、 こんなにすぐにより良い方法を教えていただけて大変助かりました。 おかげさまで解決しそうです、ありがとうございました もう一人の答えていただいた方にもお聞きしましたが、 pFrame[0]やpFrame[1]などを使わずに、pFrameのメモリから直接12bitづつ読み込むということはC++やCで可能でしょうか 参考までに知りたいだけですので、こちらはお答えいただけなくとも構いません
cateye

2019/06/18 17:56

処理系(データ型に数値として扱える12ビットというのはたぶん無い)やpFrameにも拠りますが、32ビット読み出しが可能なら(pFrame[3]にあたる部分を読み出しても問題がない)ならば、32ビット取り出して上位12ビットとそれに続く12ビットを取り出せると思います。・・・plelさんの意図と違うなら読み飛ばして下さい。
plei

2019/06/19 17:03

ご返事ありがとうございます どうも12ビットというのは扱いづらいですね 本題の質問については無事解決しました ありがとうございました
guest

0

ベストアンサー

pFrame[0] = 68 (= 01000100)
pFrame[1] = 200 (= 11001000)
pFrame[2] = 14 (= 00001110)
の場合、
010001001100と100000001110に結合・分割して
それぞれ1100と2062という数値を得ています.

この手の処理では、ビット演算を組み合わせれば必要十分です。

c++

1unsigned int a = (pFrame[0] << 4) | (pFrame[1] >> 4); 2unsigned int b = ((pFrame[1] & 0xf) << 8) | pFrame[2];

https://wandbox.org/permlink/gkT8jd4LrnFyIzSq

2進数の変換を経ないで直接pFrameから12bitごとに数値を出力したいです.

「2進数の変換」を誤解されている気がします。コンピュータ内部では2進数で数値表現されますから、ビット単位の処理はコンピュータにとって自然な計算です。(普通の人間にとっては10進計算が自然ですね。)

投稿2019/06/18 15:24

編集2019/06/18 15:27
yohhoy

総合スコア6189

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

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

plei

2019/06/18 16:20

回答ありがとうございます この方法で解決しそうです おっしゃる通り、内部での数値表現については理解不足でした すでに内部では2進数で取り扱われているのでビット演算できるということですね おかげさまで本題は解決しそうですので、以下はお答えいただけなくとも構いません ただ参考までにお聞きしたいのですが、pFrame[0]やpFrame[1]などを使わずに pFrameのメモリから直接12bitづつ読み込むということはC++やCで可能でしょうか
yohhoy

2019/06/19 00:22

> pFrame[0]やpFrame[1]などを使わずにpFrameのメモリから直接12bitづつ読み込むということはC++やCで可能でしょうか これは不可能です。C/C++に限らず、ほとんど(全ての?)プログラミング言語はバイト(byte)を基本単位として扱いますので、8bitの2べき倍(8, 16, 32, 64...)でない中途半端なバイト長を直接表現することはできません。 # 些末な例外ルールがあることにはありますが、このコメントでは無視します ;P
plei

2019/06/19 16:59

ご返事ありがとうございます できないということが分かっただけでもよかったです 元々の質問については、本日試したところ期待通りの結果が得られました 誠にありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問