Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

phpのpack関数と同じ処理

掲示板利用させていただきます。
phpのpack関数と同じ処理をjavaで行うにはどうしたら
よいでしょうか??

packの挙動は「データをバイナリ文字列にパックする」
ということだと思うのですが、
javaでバイナリ文字列といえば、単純にString型に格納
された文字列だと思っていたのですが・・。

phpのpack関数は第一引数としてフォーマット文字列を受け取れるので、たとえば'H*'を第一引数で渡した場合、
Stringの文字列を16進数変換するだけでよいのでしょうか??

ご存知の方ご教示ください;;

5

回答

13921

閲覧

5件の回答

評価

0

new String(byte[])では?

評価

0

ご回答ありがとうございます。new String(byte[])の結果を16進数に変換すると言うことでしょうか??pack関数の第一引数の意味がよく分かりません…。フォーマット文字列を表すようなのですが…。packの結果をeckoで出力しても意味不明な文字列が出るだけなのでどういう結果をもってjavaで同じ結果となったと言えるか判断できないのです。

評価

0

補足です。
phpで以下のソースで行える処理を、JAVAで行いたいのです。

--php--
$source='1';
$result = base64_encode(pack('H*', sha1($source));

--java--
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; 

String source="1";
MessageDigest mes =  MessageDigest.getInstance("SHA-1");
byte[] digest = mes.digest(source.getBytes());
String reuslt = Base64.encode(str.getBytes());

上記コードで実行すると、1バイト文字だと同じ結果になるのですが、2バイト文字だと別の結果になります・・。
何か考慮できていない点があるのでしょうか??

評価

0

ちとぐぐったところ、"H" "h"は引数をwordで扱い、かつ上位下位バイトどちらが先かを指定する…のかな。
すでに使っているgetBytes()でいいと思うけど、文字コードはなんでしょ。

getBytes()は引数を指定しないとその環境でのデフォルトの文字コードが使われる。
WindowsならShift_JIS、Unix系ならEUC-JP、最近のLinuxならUTF-8等々。
そのせいかな…という気が。

評価

0

ご回答ありがとうございます。
ご指摘の通り、getBytes();で文字コードを
指定していなかったため、2バイト文字で実行した際、
結果に差が出ていました。

phpをunix、javaをwindowsで実行していたため、
文字コードに差があったようです。
javaでgetBytes("EUC-JP");
を行うと、無事同じ結果が取得できました。

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

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。