人に聞けない痔の悩み、これでスッキリ >>

int型の内容をbyteの配列にコピーする方法を教えて下さい。

int i_value = 500;
byte[] by_value;
by_value = new byte[4];

// どのような処理が必要ですか?


by_value[0]には、0x1
by_value[1]には、0xf4
と格納したいです。
数字→文字列→文字(byte)できたのですが…。
C言語の場合、memcpy関数で型が異なってもキャストすれば回避できました。
JAVAでの方法を教えて下さい。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

とりあえず私の環境では


キャストしないとエラーになりました。
by_value[0] = (byte)(i_value & 0xff) ;
by_value[1] = (byte)((i_value>>8) & 0xff) ;
by_value[2] = (byte)((i_value>>16) & 0xff) ;
by_value[3] = (byte)((i_value>>24) & 0xff) ;
    • good
    • 0
この回答へのお礼

キャストも必要でしたね。

忘れないように気をつけます。

お礼日時:2003/07/16 19:10

>リトルエンディアンなのかビッグエンディアンなのか解らないので、


>C言語では、この問題に遭遇しましたが、JAVAではどうなのですかね?

というかCPUに依存します。
intel系だとリトルエンディアン
sun系だとビッグエンディアン

異なるCPU間で同じ結果をもたらしたいのなら
先にintel系かどうかを判定するか
シフト演算子は使わず、数学的に
対処するのが懸命です。
b[0] = (byte)(i_value / 0xff)
b[1] = (byte)(i_vakue % 0xff)
    • good
    • 0
この回答へのお礼

本題とは異なりますが、ありがとうございます。

JAVAでもCPUに依存するのですね。
C言語だと、環境が異なったら再コンパイルしていました
が、JAVAでは、最コンパイルというのは、あまりしない
ようなので、CPUがどの系統化を判断しなくてはならない
のですね。
これについては調査し、不明点等があったら別途質問
させていただきます。

ありがとうございました。

お礼日時:2003/07/18 00:25

こんにちは



プログラム言語に依存しなくても良いのでは。
リトルエンディアンなのかビッグエンディアンなのか解らないので、

by_value[0] = (i_value&0xff) ;
by_value[1] = ((i_value>>8)&0xff) ;
by_value[2] = ((i_value>>16)&0xff) ;
by_value[3] = ((i_value>>24)&0xff) ;
または
by_value[3] = (i_value&0xff) ;
by_value[2] = ((i_value>>8)&0xff) ;
by_value[1] = ((i_value>>16)&0xff) ;
by_value[0] = ((i_value>>24)&0xff) ;

ご希望に添う方で良いと思いますよ。
forループとか使っても良いですが、大した処理じゃないですね。

for (int i=0,j=0 ;i<4 ;i++,j+=8){
  by_value[i] = ((i_value>>j)&0xff) ;
}
または
for (int i=0,j=24 ;i<4 ;i++,j-=8){
  by_value[i] = ((i_value>>j)&0xff) ;
}

ご希望に添っていなければごめんなさい。
    • good
    • 0
この回答へのお礼

マスクという方法がありましたね。
ビット操作は、しばらく離れていたので忘れてました。

ありがとうございました。

>リトルエンディアンなのかビッグエンディアンなのか解らないので、
C言語では、この問題に遭遇しましたが、JAVAではどうなのですかね?

お礼日時:2003/07/16 19:08

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qbyte[2] から int へ。

それぞれintの下位2バイトのビット列保持するbyte型配列の要素2つを int 形の整数に治したいのですがいい方法が思いつきません。例えば、

byte[0] = 0x01;
byte[1] = 0x01;
ならば、
00000000 00000000 00000001 00000001
で、256 + 1 = 257

byte[0] = 0x02;
byte[1] = 0x10;
ならば、
00000000 00000000 00000010 0000011
で、512+3 = 515
です。byteの値が0~127の場合は

int n = byte[0] << 8
n = n | byte[1]
という感じでいけそうなのですが、byte[0]が 0xFF のような負の値のときにint とのビット演算(もしくはシフト演算)で上位2バイト分も補数表記のためか全部1で埋まってしまい、上の方法はだめみたいです。

byte[0] = 0x01;
byte[1] = 0xFF;

のときは、

00000000 00000000 00000001 11111111
で、256+255 = 511
としたいのですが、場合わけをせずに求める
よい方法はないでしょうか。

それぞれintの下位2バイトのビット列保持するbyte型配列の要素2つを int 形の整数に治したいのですがいい方法が思いつきません。例えば、

byte[0] = 0x01;
byte[1] = 0x01;
ならば、
00000000 00000000 00000001 00000001
で、256 + 1 = 257

byte[0] = 0x02;
byte[1] = 0x10;
ならば、
00000000 00000000 00000010 0000011
で、512+3 = 515
です。byteの値が0~127の場合は

int n = byte[0] << 8
n = n | byte[1]
という感じでいけそうなのですが、byte[0]が 0xFF のような負の値のときにint ...続きを読む

Aベストアンサー

サンプルも作ってみました。
--------------------------
public class Sample {
public static void main(String[] args) {
byte [] bytes = { (byte)0x0FF, 0x01 };
int b4 = 0;
for(byte b : bytes){
int i = 0x0FF & b;
b4 = (b4<<8) + i;
}
System.out.printf("%1$d:%1$X%n",b4);
}
}

Qjavaでunsignedは使えないのですか?

Eclipseを使い始めた初心者です。
short型変数を符号無しで宣言しようと思ったのですが、
赤の下線が出てしまってエラーの扱いになってしまっています。

javaではunsignedは使えないのでしょうか?
使えないのであれば、その理由と対処策を教えていただけましたら嬉しいです。
宜しくお願い致します。

Aベストアンサー

unsigned short などのような構文はありませんが、とりあえず負の値を使いたくないのなら char型を数値のように使えばよろしいかと思います。
char型のとりうる範囲は0~65535で、範囲外の数値はint型とみなされます(数値を直接代入する場合のみ)。
ただし負のintをcharにキャストすると上位ビットが欠落します。

char c;
c = 0;
c = 65535;
c = 65536; ←コンパイルエラー
c = -1; ←コンパイルエラー
c = (char)-1; ←コンパイルエラーにはならないが65535になる

Qint配列をbyte配列に変換

MIDPアプリを作成している初心者です。

Image データを一旦端末のレコードストアに保存しておく為、
getRGB()で取得したint配列を、byte配列に変換しなくてはいけません。

↓のように レコードストアに書き込むメソッドを書いてみました。
public void writeRecordStore( String name, Image image ) {
    int width = image.getWidth();
    int height = image.getHeight();
    int[] pxData = new int[ width*height ];
    byte[] byteData;
    RecordStore rs = null;

    try {
        //画像をバイトデータに変換
        image.getRGB( pxData, 0, width, 0, 0, width, height );
        //レコードストアを開く
        rs = RecordStore.openRecordStore( name, true );

        //バイト配列に変換 ← ここがわからない
        
        //レコードの追加
        rs.addRecord( byteData, 0, byteData.length );
        
    } catch( Exception e ) {
    }
}

int配列をbyte配列に変換する方法わかる方 ご教授の程お願いします。

また、まだコーディングに自信が無いので、文法のミスもご指摘頂けたらありがたいです。

MIDPアプリを作成している初心者です。

Image データを一旦端末のレコードストアに保存しておく為、
getRGB()で取得したint配列を、byte配列に変換しなくてはいけません。

↓のように レコードストアに書き込むメソッドを書いてみました。
public void writeRecordStore( String name, Image image ) {
    int width = image.getWidth();
    int height = image.getHeight();
    int[] pxData = new int[ width*height ];
    byte[] byteData;
    RecordStore rs = null;
...続きを読む

Aベストアンサー

> intの16~23ビットに赤、8~15ビットに青、0~7ビットに緑が入っている
> という理由だそうです。
> これは間違っていると思われますか?

残念ながら、赤・青・緑の24ビットだけでは不完全です。
MIDPのImage.getRGB()は、24~31ビット目に透明度(α値)の情報を入れて返すからです。

Qint型の変数値をバイト列としてコピー

あるint型の変数に格納されている情報を、バイト列としてコピーする方法で困っています。

変数の入っている領域をそのままコピーしたいので、memcpyを使うかと思うですが、
コピーされた結果を見ると文字列の並びが逆転しているように見えます。

--サンプルコード抜粋

unsigned int i= 12345;
unsigned char *c;

c = (char *)malloc(sizeof(int));

printf("i_hex=%x\n",i);
memcpy(c,(int *)&i,sizeof(int));

出力結果

i_hex=3039
cの出力結果 3930000000

単純にmemcpyではダメなのでしょうか?

実行環境は、CentOS(32bit)+gccです。よろしくお願いします。

Aベストアンサー

それで正常です。コピーできてます。

39 30 00 00 00

は、1の位が 0x39 で、256の位が 0x30 で、それより上の位が 0 ということです。
左から1の位から順に表示させているので、逆に見えるだけ。

Qバイナリデータとテキストデータの違いについて

宜しくお願いします。

バイナリデータを用語辞典で調べると
「テキスト形式(文字データ)以外のデータ形式全般のこと。
実行可能形式のコンピュータプログラムや、画像や音声、
動画などのデータなどがバイナリデータにあたる。」
(http://e-words.jp/w/E38390E382A4E3838AE383AA.html)
とあります。

これでは、バイナリデータとテキストデータの違いが分かりません。

テキストデータはコードの集まりで、
さらに細かくすると0と1の集まり(?)だから・・・
と考えるとバイナリデータとテキストデータの
違いが分かりません。

Q1.私は何が分かっていないのでしょうか?
Q2.バイナリデータとテキストデータの違いを教えてください。

宜しくお願い致します。

Aベストアンサー

バイナリデータは01の集まりです。
テキストデータは文字としての意味が与えられて居ます。ただテキストデータの01としての表現方法はプラットフォーム(OSやアプリケーション)によって異なります。例えば英文字コードでもメインフレームで使われるEBCDICもあり、unixやPCで使われるASCIIもあります。また日本語など英語以外の文字をあらわすのには、さらに多くの種類があります。また改行を表す文字もいろいろです。
例えば telnet で他のコンピュータにログオンして通信する時の文字コードはASCIIで、改行はCRLFと決まっているので、そうでないコンピュータはtelnetプログラムが自分のコンピュータのコード体系と相互変換します。

ftpでテキストデータを転送する時も同じくASCIIとCRLFと決まっています。ただ日本語文字の時にどのコードを使うかは規格では決まっていないので、ftpクライアントで、相手コンピュータの日本語コード種類を指定して、自分と合わなければ転送時に相互変換します。

Cプログラムでもテキストの改行は'\n'と決まっているので、そうでないWindowsの場合はCプログラムとの間でCRLFと'\n'の相互変換が、ライブラリ中で自動的に行われます。

そういった変換を全く行わないのがバイナリデータです。画像ファイルなどはjpegと形式が決まればどのコンピュータでも同じフォーマットなので変換の必要はありません。逆にテキストとみなして変換するとデータが壊れてしまいます。

バイナリデータは01の集まりです。
テキストデータは文字としての意味が与えられて居ます。ただテキストデータの01としての表現方法はプラットフォーム(OSやアプリケーション)によって異なります。例えば英文字コードでもメインフレームで使われるEBCDICもあり、unixやPCで使われるASCIIもあります。また日本語など英語以外の文字をあらわすのには、さらに多くの種類があります。また改行を表す文字もいろいろです。
例えば telnet で他のコンピュータにログオンして通信する時の文字コードはASCIIで、改行はCRL...続きを読む

Qchar型からアスキーコードへの変換

Javaでchar型配列に入っている文字をアスキーコードに変換する方法をご教授ください。

Aベストアンサー

char型は内部的には「UTF-16」でエンコーディングされているので、
キャストしただけでは、アスキーコードには変換できません。
(できることはできるが、他国後との対応を考えるとbyte配列に直しにくい。)

簡単にやるなら。


// char型配列の生成
char[] charArray = {'a', 'b', 'c'};

// byte型配列
byte[] asciiArray;

// 文字列クラスの生成(getBytesメソッドを使うため)
String string = new String(charArray);

// 文字コード変換 (・∀・)σ GOGO!
asciiArray = string.getBytes("Shift_JIS");


とかでいいんじゃないでしょうか?
Shift_JISと書いた箇所に好きなエンコーディング名を入れてください。

Qlong型のデータをバイト型の配列に代入する方法

long型のデータを配列を使って1byte毎に分けたい処理を作りたいのですが、
やりかたとしてはlong型のアドレスをポインタ変数に渡して、
ポインタ変数をバイト配列に代入する方法になりますでしょうか?

具体的なプログラムはこんな感じと考えてますが
unsigned long LONG:
unsigned char AAA[8], *pon, i:

pon = &LONG

for(i=0 i<8 i++)
{
AAA[i] = *pon + i;
}

C言語に詳しい方教えてください、よろしくお願いします。

Aベストアンサー

バイトオーダーを無視してよいのであれば...

memcpy(AAA, &LONG, sizeof(LONG));

とするのが基本です。
以下のように、共用体を使う方法もありますが、任意のバイト配列に格納するにはさらにコピーが必要になります。

union U
{
 unsigned long LONG;
 unsigned char AAA[sizeof(unsigned LONG)];
} u;
u.LONG = 値;

もし、ビッグエンディアンとして扱いたいのであれば次のようにします。

for (std::size_t i = 0; i < sizeof(LONG); i++)
 AAA[i] = LONG >> (CHAR_BIT * (sizeof(LONG) - 1 - i));

リトルエンディアンとして扱うなら次のようにしてください。

for (std::size_t i = 0; i < sizeof(LONG); i++)
 AAA[i] = LONG >> (CHAR_BIT * i);

ちなみに、unsigned char型は必ず1バイトですが、ビット数は8ビットとは限りませんので、必ずCHAR_BITを使う必要があります。
また、unsigned long型が何バイトなのかも処理系定義です。
32ビット以下の多くの処理系や64ビットWindowsではunsigned long型は32ビットですが、多くの64ビットの処理系ではunsigned long型は64ビットです。
また、char型が16ビットや32ビットや64ビットの処理系も実在しますので、その場合はunsigend long型が2バイトや1バイトになることもあります。
一部のDSPではunsigned long型が48ビットで6バイトというものも存在します。

バイトオーダーを無視してよいのであれば...

memcpy(AAA, &LONG, sizeof(LONG));

とするのが基本です。
以下のように、共用体を使う方法もありますが、任意のバイト配列に格納するにはさらにコピーが必要になります。

union U
{
 unsigned long LONG;
 unsigned char AAA[sizeof(unsigned LONG)];
} u;
u.LONG = 値;

もし、ビッグエンディアンとして扱いたいのであれば次のようにします。

for (std::size_t i = 0; i < sizeof(LONG); i++)
 AAA[i] = LONG >> (CHAR_BIT * (sizeof(LONG) - 1 - i));

リト...続きを読む

Qexecute()

execute()は、複数の結果を返す可能性のある SQL 文を実行するメソッドですが、実際に複数の結果を返すSQL文というのは、例えばどういうものなのでしょうか?

Aベストアンサー

APIリファレンスを呼んだ限りでは、

executeメソッドは、executeQueryとexecuteUpdateの両方の役割として使うことができる。
executeQueryのように使われて「検索結果がある」ときはtrueを返す。
executeQueryのように使われて「検索結果がない」ときはfalseを返す。
executeUpdateのように使われたときはfalseを返す。

ってことじゃないかしら。

参考URL:http://java.sun.com/j2se/1.3/ja/docs/ja/api/java/sql/Statement.html

QJavaには、構造体はないんですか?

 C言語の構造体みたいなのはないんですか?

野球のデータを扱っているのですが、構造体がないのでできません。

打率の順位をソートしたいのですが、Cでは構造体でソートすれば選手名まで全部ソートできたのですが。。。

Javaでは、いちいち選手名、打率などの配列を作っているのですが、打率をソートしてから選手名と一緒に表示しようとしても打率の配列だけ、ソートしてあり選手名の配列と打率の配列があいません。

要するに、打率の配列はソートし、選手の配列はデータを入力したときのままなので、順番が違っているのです。

うまい方法を教えてください。初歩的な質問でごめんなさい。

Aベストアンサー

メンバーが public なクラスが構造体と(ほぼ)同じです。

大体こんな感じ。

// sort Object using Arrays.sort()

import java.util.Arrays;

class Batter implements Comparable {
 public double rate;
 public String name;
 Batter(double r, String n) {
  rate = r;
  name = n;
 }
 public int compareTo(Object o) {
  return (int)((rate - ((Batter)o).rate)*1000.);
 }
}

class w03 {
 public static void main(String[] args) {
  Object[] batter = {
   new Batter(0.3, "ichiro"),
   new Batter(0.1, "shinjo"),
   new Batter(0.0, "irabu")
  };

  // sort
  Arrays.sort(batter);

  // print-out to console
  for (int i=0; i < batter.length; i++) {
   Batter b = (Batter)batter[i];
   System.out.println(b.name + " " + Double.toString(b.rate));
  }
 }
}

このように java.util.Arrays の sort() メソッドを使うと、C でやってた
イメージに近くなります。

C の qsort() と違って、どんなデータでもソートできるわけではなく、対象と
なるクラスは Comparable インターフェースを実装しなくてはいけません。

メンバーが public なクラスが構造体と(ほぼ)同じです。

大体こんな感じ。

// sort Object using Arrays.sort()

import java.util.Arrays;

class Batter implements Comparable {
 public double rate;
 public String name;
 Batter(double r, String n) {
  rate = r;
  name = n;
 }
 public int compareTo(Object o) {
  return (int)((rate - ((Batter)o).rate)*1000.);
 }
}

class w03 {
 public static void main(String[] args) {
  Object[] batter = {
...続きを読む

Qbyte型をstring型として扱うには

今日の質問/マイページに反映されないので、再度の質問です。
windows2000-sp4/vb6-sp5環境です。ユニコードのデータをvbで直接入出力し、vb内でstring型で扱いたいとおもっています。今のところ、vbの入出力では、自動的にsjis/unicode変換がされるので、binaryで受け取り、string型にするのかなと思っています。byte型で受け取り、APIの"MoveMemory"("RtlMoveMemory")でstring型にcopyするのかなとは思っているのですが、うまくいきません。経験不足そのものです。vbでのbyte型とstring型双方向のbinaryな変換の方法をお教えください。

Aベストアンサー

dim s as string
dim b() as byte

'文字列 -> byte配列
b = s

'byte配列 -> 文字列
s = b


人気Q&Aランキング