• ベストアンサー

PHPのPACK関数でエラーが止まらない

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

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

そもそも第1引数が"H*"の時のpack関数が何をするかは分かってるかい? 仮に$BBBに"0123456789abcdef"が入っていたら、 $AAA = pack("H*", $BBB); の結果、$AAAは、0x01、0x23、0x45、0x67、0x89、0xab、0xcd、0xefという8バイトの文字列になる。 つまり、H*なpackの第二引数は16進数をASCII文字で表現したもので、とりうる値が半角の0から9またはaからfでかつ偶数個である文字列じゃないといけない。 当然yとか出てきたら困る。円マークも然り。 $BBBには何が入っているのか(動作)、何が入っているべき(仕様)なのかもう一度練り直したがいいんじゃないかな。私はどら焼きは断然練り餡派だ。

duowhite
質問者

お礼

ご教授いただきありがとうございます。 pack関数の意味を理解していませんでした。 お恥ずかしい限りです。 原因が分かって、問題解決しました。 助かりました。ありがとうございます。 ちなみに私はつぶ派です笑

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

データがおかしいのでは?0~9A~Fa~f以外の文字が入っている。 そもそも、H を指定して packする意味を理解していますか?というか、何を目的にしてpackしているのか理解していますか?

duowhite
質問者

お礼

ご教授いただきありがとうございます。 勉強不足でした。申し訳ありません。 おかげさまで解決することができました。 ありがとうございます。

関連するQ&A

  • 指定文字列を空文字に

    教えてください。 文字列(数字)に含まれる「,」を空白文字に変換しようと思い、下記のように記述しましたがうまくいきません。 $aaa='11,,111'; $bbb = str_replace($aaa,'',','); $bbbには「,」が返ってきてしまいます。$aaaは「11,,111」のままです。 $bbbに「11111」という値が返ってきてほしいのですが、どうすればよいでしょうか? どうかご教授ください。

    • ベストアンサー
    • PHP
  • 【PHP】半角「\」を全角「¥」に変換したい

    PHP初心者です。 バージョンは4.4.4 ファーストサーバ 文字コードはUTF-8 です。 マルチバイト文字の中の半角「\」をそれ以外の文字に変換したいのですがどうすればできるでしょうか? (1)$str = mb_ereg_replace("\\", '¥', $str); (2)$str = preg_replace("\\", '¥', $str); (1)も(2)もエラーとなり変換できません。 お詳しい方、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • アクセスのクエリでSplit関数は使えないのですか

    レコードにaaa/bbb/cccと入っていて、 クエリで SELECT Split([テーブル1]![フィールド1],"/") AS test FROM テーブル1; とすると、 式に未定義関数 <関数名> があります。(Error 3085) になります。 VBAでやるとしたら Sub test() Dim str As String str = "aaa/bbb/ccc" Debug.Print Split(str, "/")(1) End Sub のような事がしたいのですが クエリでは無理なのでしょうか?

  • mb_ereg_replaceについて

    マルチバイトでの置き換えについて質問です。現在は以下のように str_replaceで置き換えしており文字化けはないのですがマルチバイト 対応のmb_ereg_replaceで実行したほうがいい事を知りました。 以下現在のソースです。 // 検索文配列 $search = array("{#aaa#}", "{#bbb#}", "{#ccc#}"); // 置き換え文配列 $replace = array("あああ", "いいい", "ううう"); // 置き換え $str = str_replace($search, $replace, $str); 単純にstr_replaceをmb_ereg_replaceにしてみたのですがエラーに なってしまいました。 置き換えしたい文字が複数あるのでできれば検索文字、置き換え文字を 配列として使用したいのですがどうすればいいのでしょうか? ちなみにですが文字コードはutf-8です。

    • ベストアンサー
    • PHP
  • C#での関数テーブルの作り方

    お世話様です。 C++で関数ポインタを使用していたのですが、C#にそのまま持ってくると エラーが発生します。 C++でのコードをどのように変更したら良いでしょうか。 [C++] typedef struct {  char *cmd;  BOOL (*exe)(char* oprand); }FTBL; FTBL tbl[] = {  { "AAA", aaa },  { "BBB", bbb },  { "CCC", ccc } }; [C#](当方のコードでエラーがでます。) delegate bool Execute( string oprand ); struct FTBL{  string cmd;  Execute exe; }; FTBL[] tbl = {  { "AAA", aaa },  { "BBB", bbb },  { "CCC", ccc } }; コマンド名とコマンド関数のテーブルですが、要は関数テーブルの 作り方を知りたいのです。 ご教授よろしくお願いいたします。

  • 定義済み関数

    すみません。以下のコードで、 フォームから入力された # で区切られた文字列 例えば、 #焼肉#すき焼き#しゃぶしゃぶ を、#で分け表示しています。 以下のコードでは成功しいていますが、長いので定義済み関数とfor文で同じことをしたいです。(厳密には出力結果が少し違いますが・・・) よろしくお願いします。 現在のコード $tag=explode("#",$row[2],6); $files=str_replace("タグ1",$tag[1],$files); $files=str_replace("タグ2",$tag[2],$files); $files=str_replace("タグ3",$tag[3],$files); $files=str_replace("タグ4",$tag[4],$files); $files=str_replace("タグ5",$tag[5],$files); $files=str_replace("タグ",'<ul>'.'<li>'.'<a href="../article.php?tag='.$tag[1].'">'.$tag[1].'</a>'.'</li>'. ' <li> '.'<a href="../article.php?tag='.$tag[2].'">'.$tag[2].'</a>'.'</li>'. ' <li> '.'<a href="../article.php?tag='.$tag[3].'">'.$tag[3].'</a>'.'</li>'. ' <li> '.'<a href="../article.php?tag='.$tag[4].'">'.$tag[4].'</a>'.'</li>'. ' <li> '.'<a href="../article.php?tag='.$tag[5].'">'.$tag[5].'</a>'.'</li>'.'</ul>',$files); 作りたいコード function tag() { $tag=explode("#",$row[2],6); for( $i=0; $i<count($tag); $i++ ){ echo '<li>'.'<a href="'.$tag[$i].'">'.$tag[$i].'</a>'.'</li>'.;//タグが何個あるかわからないため結合演算子で終わりたいが、 syntax error, unexpected ';' in のエラーが出てしまう。 }} $files=str_replace("ページのお題",'<ul>'.'<li>'.'<img src="../'.$row[1].'">'.'</a>'.'</li>'. '<div class="article-tag">'. ' <li> '.tag()'</li>'.'</div>'.'</li>'. '<li>'.$row[3].'</li>'.'</ul>',$files);//上記の .(定義済み関数での結合演算子を省くと syntax error, unexpected ''</li>'' (T_CONSTANT_ENCAPSED_STRING) in のエラーが出てしまう。)

    • ベストアンサー
    • PHP
  • htaでVBSのソースを書いたらエラーを返します

    以下のソースででエラー文が返ってきてしまいます。 エラー文が帰ってくる場所には矢印と文をつけました。 エラー文は二つ返ってきます。 VBスクリプトとhtaを組み合わせたような感じになっております。 初心者で構文もよくわかっていないのですがよろしくお願いします。 やりたい処理は親フォルダのテキストファイルから文字列を読み込み、 その結果によって初期のチェックボックスを移動させるような感じです。 フォルダのテキストファイルから文字列を読み込む処理と 初期のチェックボックスを移動させる処理を組み合わせたらエラーがでたといった感じです。 <script language="VBScript"> Option Explicit Dim objFileSys Dim strScriptPath Dim strReadFile Dim strWriteFile Dim objReadStream Dim objWriteStream Dim strText Dim str Dim gyou(100) Dim i Dim data str = Replace(window.location&"","file:///","") str = Replace(str,"/","\") str = Replace(str,"%20"," ") str = Replace(str,"新しいテキスト ドキュメント (2).hta"," ") str = Replace(str,"vbs.hta"," ") str = Replace(str,"gattai.hta"," ") str =str+"text.txt" Set objFileSys = CreateObject("Scripting.FileSystemObject") strReadFile = objFileSys.BuildPath(strScriptPath,str) msgbox strReadFile Set objReadStream = objFileSys.OpenTextFile(strReadFile, 1) for i = 1 to 5 strText = objReadStream.ReadLine gyou(i) = strText NEXT objReadStream.Close Set objReadStream = Nothing Set objFileSys = Nothing </script> <!DOCTYPE html> <head><script> 文字が一致しません→   function foo(){ var a=document.getElementById("A"); var fso=new ActiveXObject("Scripting.FileSystemObject"); var data=gyou(1) if(data=1){ document.getElementById("A").checked="checked"; }else{ document.getElementById("B").checked="checked"; } } </script> 型が一致しません→   </head><body onload="foo()"> <input id="A" type="radio" name="aaa">A <input id="B" type="radio" name="bbb">B </body> </html>

  • ImageXのパラメータ欄にフルパス名を指定すると、エラーになります。

    ImageXのパラメータ欄にフルパス名を指定すると、エラーになります。 例えば、F:\AAA\BBB.Wim を指定する場合、 ImageX /Apply F:\AAA\BBB.Wim 1 H: と入力すると Error opening file [F:\AAA\BBB.Wim]. と表示され、続いて”指定されたファイルが見つかりません。”のメッセージが表示されます。 F:\AAA\BBB.Wim は確かに存在します。F: に移動し Cd AAA を実行後 ImageX /Apply .BBB.Wim 1 H: と入力すれば正しく実行されます。 いくら考えても、私の入力操作に間違いが有るとは思えません。 皆さんのご意見をお聞かせください。

  • 絵文字の格納と抽出について!2

    http://oshiete1.goo.ne.jp/qa5252187.html さっき↑であれしたんですけど、ナンダカンダで絵文字は出てくれました。 //変換できる絵文字が無いための処理 mb_substitute_character("long"); //抽出する文字コード変換(これは絵文字に関係ありません) $str = mb_convert_encoding($row['str'],'SJIS','EUC-JP'); //絵文字を16進数!?みたいのに変えてDBへ格納 $str = preg_replace('/\[d:(F[89][0-F]{2})\]/e', "pack('H*', $1)", $str); 格納した絵文字のコードにナンヤカンヤチョメチョメを行い抽出 $str = preg_replace('/BAD\+(F[89][0-F]{2})/', '[d:$1]', $str); これはIモードのみのようでした。 他のキャリアはダメですか! 絵文字は出ても全部真っ黒です!

    • ベストアンサー
    • PHP
  • お世話になります。各キャリアの絵文字コードの格納方法です。

    こんばんは。 長文になります。 説明下手&中卒と言う事もあり多少分かりにくい部分、多々あるかと思われます。 ご了承下さい。 携帯サイトの絵文字の格納方法についてです。 現在、 $str = preg_replace('/\[d:(F[89][0-F]{2})\]/e', "pack('H*', $1)", $str); $str = preg_replace('/BAD\+(F[346789][0-F]{2})/', '[d:$1]', $str); と言うソースにてDBへ格納しております。 太陽の絵文字の場合 AU    [d:F660] と格納されます。 DOCOMO   [d:F89F] と格納されます。 これらを抽出→表示した場合、AU端末ではDOCOMO端末から格納されたコード [d:F89F] もきちんと太陽の絵文字は表示されました。 しかし、DOCOMO端末ではAU端末から格納されたコード  [d:F660] を表示する事は出来ませんでした。(真っ白状態です) これは大変だ。あらまどうしましょ。と言う事になり、悩みました。 毎日悩みました。 見つかりました。ひらめいたのです。 格納するときに [d:F660] も [d:F89F] も10進数コード(太陽の場合  )にしてしまったら良いのかなと思ったのです。 これらを一つづつプログラム行う事により出来るのかなと思いました。 色々参考サイト見てみると[d:F89F]の様なコードを使っていらっしゃる方がいます。 10進数コードと [d:F89F]の様な形式ではどちらにメリット デメリットあるのでしょう。 10進数コードでの格納の場合現在の下記のソースに [d:F89F] =  ですよと言う定義を付け加えなければいけませんよね。 $str = preg_replace('/\[d:(F[89][0-F]{2})\]/e', "pack('H*', $1)", $str); $str = preg_replace('/BAD\+(F[346789][0-F]{2})/', '[d:$1]', $str); 10進数コードにした場合、キャリア別に別ファイルから絵文字を読み込むなどの作業も必要なくなりますか。 ちなみにSOFTBANKは基本的に無い事にしてます。 ご教示いただけたらと思います。 ちなみにPHPファイル(SJISコード)になります。

    • ベストアンサー
    • PHP