JavaでPHPのpack関数を実装する方法

このQ&Aのポイント
  • JavaでPHPのpack関数と同等の機能を実装する方法を探しています。
  • 既存のgetHexBinaryメソッドでは数値文字列しか返ってこないため、PHPのpack関数の結果と同様の結果を得ることができません。
  • Javaのバージョン5.0を使用しており、PHPのバージョンは5.2です。
回答を見る
  • ベストアンサー

PHPのpack関数をJavaで実装できるのでしょうか

PHPで文字列を16進バイナリ文字列に変換する関数であるpack関数というものがありますが、これと全く同じ動きをしてくれるメソッドがjavaには存在しないようです。これを自分で実装する方法をあれこれ考えているのですが、どうしてもうまくいきません。 下のようなメソッドを作ってみたのですが、戻ってくるのはただの数値文字列です。 /** * @param toPack バイナリへの変換対象の数値 */ String getHexBinary(int toPack){ String buf = ""; String hex = Integer.toString(toPack, 16); char decChars[] = hex.toCharArray(); for(int decChar : decChars){ buf += Integer.toHexString(decChar); } return buf; } PHPのpack関数はこの戻ってくる数値文字列を何らかの手法で結合しているように見えるのですが、その挙動が理解できずに困っています。どなたか、ご教授願えないでしょうか。ちなみに、Javaのバージョンは5.0でやっています。PHPのバージョンは5.2です。

  • Java
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • tom11
  • ベストアンサー率53% (134/251)
回答No.1

外しているかもい知れませんが、 ググルト http://www.javaroad.jp/bbs/answer.jsp?q_id=20080427120147667 同じタイトルの質問と回答があります。

Sugichi28
質問者

お礼

tom11さん、どうもありがとうございます。このリンク先のものを見ると、base64エンコードを行っています。これは行わずに、単にpackの結果だけを得たい場合は、getBytesだけで終わればいいってことでしょうか。

関連するQ&A

  • pack関数

    今、少しずつPHPを勉強をしているのですが、 pack関数がわかりません。 http://www.php.net/manual/ja/function.pack.php にある例 1の結果がなぜ 0x12, 0x34, 0x78, 0x56, 0x41, 0x42 のように なるのですか? またこのバイナリ文字列を普通の文字にするには どうすればいいのですか? 参考になるサイト等がありましたらこれも一緒に 教えて下さい。

    • ベストアンサー
    • PHP
  • [Perl] Pack関数について教えてください。

    こんにちは。 下記は、pack関数のサンプルスクリプトですが、 なんでそのような結果になるのか、よくわかりません。どなたか教えていただけますか。 print "文字列を入力してください:"; $string = <STDIN>; chomp ($string); $length = length($string); print "数値を入力してください:"; $number = <STDIN>; chomp ($number); # Do Pack! $packed = pack("A${length}i", $string, $number); print "パック文字列: $packed\n"; --- 結果 --- 文字列を入力してください:perl 数値を入力してください:100 パック文字列: perl

    • ベストアンサー
    • Perl
  • JavaでXORによる暗号化

    JavaでXORによる暗号化について調べていたら下記URLのサイトを見つけました。 http://www.eeb.co.jp/2007/07/_10_1.html そこでサンプルにあった下記プログラムをvalue と key を変えて実行してみたところ value の中の「は」、「で」がうまく復元されず文字化けしてしまいました。 どこが悪いのかよくわからないのですがお分かりになられる方がいらっしゃいましたら 教えていただけますでしょうか。 public class XorTest { //================================================== // メイン //================================================== public static void main(String[] args) { String value = "abcd本日はお日柄もよろしいようで"; String key = "1"; // 暗号化前出力 print("暗号化前", value); // 暗号化 byte[] byteEncodeArray = encode(value.getBytes(), key); value = new String(byteEncodeArray); // 暗号化後出力 print("暗号化後", value); // 復元 byte[] byteDecodeArray = decode(value.getBytes(), key); value = new String(byteDecodeArray); // 復元後出力 print("復元後", value); } //================================================== // 暗号化 //================================================== private static byte[] encode(byte[] src, String key) { byte[] byteKeyArray = new byte[0]; byte[] byteEncArray = new byte[src.length]; // キーの文字列を変換する文字列をカバーするまで繰り返す while(byteKeyArray.length < src.length) { byteKeyArray = (new String(byteKeyArray) + key).getBytes(); } // 変換 for (int i = 0; i < src.length; i++) { byteEncArray[i] = (byte)(src[i]^byteKeyArray[i]); } return byteEncArray; } //================================================== // 復元 //================================================== private static byte[] decode(byte[] src, String key) { return encode(src, key); } //================================================== // ダンプ文字列取得 //================================================== private static String getDump16(byte[] value) { StringBuffer buf = new StringBuffer(); for (int i = 0; i < value.length; i++) { String hex = Integer.toHexString((int)value[i] & 255); // 4桁に揃える hex = "0000" + hex; hex = hex.substring(hex.length() - 4, hex.length()); // バッファに追加(空白区切り、10桁ずつ改行) buf.append(hex + (i % 10 == 9?System.getProperty("line.separator"):" ")); } return buf.toString().trim(); } private static void print(String title, String value) { System.out.println("【 " + title + " 】"); System.out.println("-----------------------------"); System.out.println(value); System.out.println(getDump16(value.getBytes())); System.out.println(); System.out.println(); } }

    • ベストアンサー
    • Java
  • PHPの構文、返り値がintの意味

    初学者です。 入門用テキストや、PHPの公式サイトを参照すると 以下のような解説があります。例えば printf関数について見てみると以下のような事が他の関数等を調べても出てきます。あまり気にしていいなかったのですがそういう訳にも行きません。 printf ( string $format , mixed ...$values ) : int この場合、string は「文字列」、$formatは「書式文字列」, mixedは型は「数値、文字列、浮動小数点など何でもいい」, ...$values引数の値 という解釈でいいのでしょうか? int printf( string $format [, mixed $args [, ・・・]]) こちらも同じ意味かと思います。 またHP公式サイト、入門用テキストの両方とも int がついています。これは戻り値(返り値)のことかと思います。 自分の中では「 (int) (integer). 整数型への変換」としか解釈出来ません。しかし、下に記述しているPHPでは返ってくるのは文字列、浮動小数点です。色々ウェブサイトを探していると、「[1]を表す」というようなのを見かけたのですが何のことかわかりません。 上記「int」について初心者でもわかるように教えていただけないでしょうか? よろしくお願いいたします <引用> printf — フォーマット済みの文字列を出力する (PHP 4, PHP 5, PHP 7, PHP 8) printf ( string $format , mixed ...$values ) : int (PHP公式) https://www.php.net/manual/ja/function.printf.php 構文 printf関数 int printf( string $format [, mixed $args [, ・・・]]) (独習PHP第3版) ----------------------- <記述> <?php printf('%sは%sです。','きなこ','ハムスター'); echo "<br>\n"; printf("売上平均(前月比): %+0-8.3f", 0.198765); ?> <表示結果> きなこはハムスターです。 売上平均(前月比): +0.19900

    • ベストアンサー
    • PHP
  • PHPのstrcmp関数について

    PHPのstrcmp関数の動きがよくわかりません。 strcmp (PHP 4, PHP 5) strcmp — バイナリセーフな文字列比較 説明 int strcmp ( string $str1 , string $str2 ) この比較は大文字小文字を区別することに注意してください。 パラメータ str1 最初の文字列。 str2 次の文字列。 返り値 str1 が str2 よりも小さければ < 0 を、str1が str2よりも大きければ > 0 を、 等しければ 0 を返します。 ・・・・・・・・・とマニュアルには上記のようにあります。 聞きたい事!▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼ 1 このstr1がstr2より大きいとはどういうことでしょうか? 2 実際に動きを確認するためにstrcmp関数を他のPHPのビルトイン関数で実現できないのでしょうか? 私の想像では、この関数にあたえる二つの引数を10進数に変換して、値の大きさを比較するという方法なのですが・・。 たとえば <?php $str01 = "a"; $str02 = "b"; print strcmp($str01,$str02); print "<br />"; //上記の値は-1がでるためこの場合 $aのほうが$bより小さいことになる。 //$aの値の文字aが小さいとは?どういうことか //私の、ぱっと思いついた方法は、以下のような意味? $str01 = bin2hex($str01); print $str01 ; //16進数でaという値を表すと61がでる print "<br />"; $str01 = hexdec($str01); print $str01; //10進数でaという値を表すと97がでる print "<br />"; //上記を同じく$bに行うと $str02 = bin2hex($str02); print $str02 ; //16進数でaという値を表すと62がでる print "<br />"; $str02 = hexdec($str02); print $str02; //10進数でaという値を表すと98がでる print "<br />"; print "<hr />"; /* 結果、$aは$bより 【小さい】という事なのでstrcmpは-1を返したと・・・。 こういう事をかんがえてみました。 そしてこれは、普通に考えれば a => bという順序なので アルファベット順になります。 しかしこのやり方だと */ $str03 = "aaaaaaa"; $str04 = "bb"; //と上記のような文字列があった場合同じく同じ手順で値をだすと $str03 = bin2hex($str03); print $str03 ; //16進数でaという値を表すと61616161616161がでる print "<br />"; $str03 = hexdec($str03); print $str03; //10進数でaという値を表すと27410143614427489がでる print "<br />"; //上記を同じく$bに行うと $str04 = bin2hex($str04); print $str04 ; //16進数でaという値を表すと6262がでる print "<br />"; $str04 = hexdec($str04); print $str04; //10進数でaという値を表すと25186がでる print "<br />"; /*ただ上記の方法だと、$str03と$str04を比較すると$str04の【bb】という値の方が 小さくなり順序的には bb => aaaaaaとなりアルファベット順にするとこができない。 三つ目の質問 3 アルファベット順にソートしたいとき標準のsort関数を使わずに他のPHPの標準関数の組み合わせでアルファベット順に並び替える 関数はつくれないのか? どなたか、ご意見お聞かせください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • fgets関数を使用したときの文字あふれについて

    fgets関数を用いて文字列を入力し、その長さを測るプログラムを作っています。 #include <stdio.h> #include <string.h> #define MAX 256 int main ( int, char *[] ); int main ( argc, argv ) int argc; char *argv[]; { char buf[( MAX )]; while ( 1 ){ memset ( buf, 0, sizeof( buf )); fgets ( buf, MAX, stdin ); if( fgets == NULL ){ break; } printf("入力した文字列の長さは%dです\n" ,strlen( buf )); } return 0; } このプログラムでは、256までしか文字列の長さを測ることができません。 もしこのプログラムで256を超える文字列を入力してしまうと、文字のあふれが発生し、 「入力した文字列の長さは256です」 「入力した文字列の長さは(あふれた文字列の長さ)です」 とこのようになってしまいます。 このプログラムで256以上の文字を読み捨てて、 「入力した文字列の長さは(あふれた文字列の長さ)です」 を表示しないようにできるのでしょうか? また読み捨てた文字列の長さを知ることはできるのでしょうか? もしかしたらfgets関数を使用すると不可能なのではないか?と思っています。 分かる方が居ましたらどうか教えて下さい。 よろしくお願いします。

  • javaでの関数の呼び出し方について

    現在次のような関数を作成しました。 public void number_state(String[] st_number,byte[] bytes,int i) {       -----------------(中略)------------------ } この関数をmain関数で次のように呼び出そうとしました。 public static void main(String[] args) { byte[] bytes = new byte[1024]; // 受信バッファ  -----------------(中略)------------------ number_state(st_number,&bytes[0],i); -----------------(中略)------------------ } このように書くとエラーがでてしまいます。 st_numberというstring文字列とiというデータでbytesの数値データを作成し、それをmain関数内でも使えるような関数を作りたいのですが、このエラーの解決方法をご教授頂きますようお願い致します。

    • ベストアンサー
    • Java
  • PHPとJavaでSHA256の結果を同じにしたい

    PHPから JavaServletにアクセスするシステムを作っています。 その際にパラメーターの改ざん対策にハッシュを渡すようにしたいのですが PHPでSHA-256でハッシュ化した値と JavaでSHA-256でハッシュかした値が異なってしまいます。 PHPだとハッシュ化する際の秘密鍵を指定する項目がありますが Javaでは見つかりませんでしたので この項目が違うために結果が違うのだと予想していますが Javaが内部的に使っている秘密鍵はどこか取得できるのでしょうか? やりたいこととしてはPHPとJavaで同じハッシュが取得できるようにしたいのですが 良い案とかやり方あったら教えてください。 ◆php string hash_hmac ( string $algo , string $data , string $key [, bool $raw_output = false ] ) ◆Java DigestUtils.sha256Hex(string data) わかる方いましたら教えてください。よろしくお願いいたします。

    • ベストアンサー
    • Java
  • PHPのPACK関数でエラーが止まらない

    PHPのPACK関数で次のエラーが多発しています。 ▼エラーメッセージ pack(): Type H: illegal hex digit y ※最後の文字は「y」とは限らないです ▼エラーのコード $AAA = pack("H*", $BBB); 調べたところ¥マークが入っていると このエラーが出るようでしたので、直前に除去するようにしました。 ▼直前に追加したコード $BBB = str_replace("\\", "", $BBB); しかし、まだエラーが止まりません。 どなたか解決策をご存知の方いらっしゃいますでしょうか?

    • ベストアンサー
    • PHP
  • Javaのオーバーライドについて教えてください!

    //Sample.java class A extends Fina{ public int part(String str1,String str2){ int iN1 = Integer.parseInt(s1); int iN2 = Integer.parseInt(s2); intNum1 *= intNum2; return intNum1; } } このプログラムに対応するように同じクラス内でオーバーロードした際のプログラムを教えてください。 オーバーロードの内容は、partメソッドをオーバロードして引数にString型のデータを二つ受け取り、2つのString型のデータをそれぞれint型に変換し、それぞれかけた値を別のクラスでメインから呼び出すにはどうすれば良いですか?

    • ベストアンサー
    • Java