0


私が直面している問題を説明する前に、私のユースケースから始めます。

phonegap フレームワークを使用してモバイル アプリケーションを構築しています。
このアプリケーションでは、ファイル (カメラで作成した写真) をアップロードする必要があります。
ほとんどのプラットフォームでは、このイメージを base64 でエンコードされたイメージとして取得できます。
これをサーバーに送り返すと、デコードして保存できます。(QRコードなので、他のいくつかの機能を実行します)。

現在、シンビアンでは、base64 文字列を取得できず、画像への URI しか取得できません。xmlhttprequest を使用して画像データを取得し、javascript を使用して base64 にエンコードできるため、これは問題ではありません。

このメソッドは機能しますが、問題が発生します。
symbian ブラウザにはバグがあるようです。これは 2005 年の Webkit ベースのブラウザーです (そうです、最新の s60 フォンでも、それほど古いものです)。
バグは、(utf-8 テーブルにない) 知らないすべての文字を 2 バイトに変換することです。記憶が正しければ、すべてが 127 以上でした。

javascript を使用してこのバグを修正しようとしましたが、うまくいきませんでした (キャンバス 2d はブラウザーでサポートされていないため、キャンバスと getBinaries などはサポートされていません)。

そのため、バイトを修正するためにphpで回避策を構築しようとしています。これは私が今持っているものですが、機能していません:

function getValidBin($bin, $offset = 0) {
    $binLength = sizeof($bin);
    for ($i = $offset; $i<=$binLength; $i++) {
        if ($i == $binLength) {
            return false;
        }
        if ($bin[$i] < 127) {

            $binT = $bin[$i] + $bin[$i+1];
            $bin2 = $bin;
            $bin2[$i] = $binT;
            $bin2[$i+1] = null;
            if (imagecreatefromstring($bin2) != false) {
                return $bin2;
            } else {
                $bin3 = getValidBin($bin2, $i);

                if ($bin3 != false) {
                    return $bin3;
                }
            }
        }
    }
}

この機能は何らかの理由で機能していません。次の警告が表示されます。

警告: imagecreatefromstring() [function.imagecreatefromstring]: /opt/content/erik/omnicol/HTML/WS/services/qrDecoder/QrDecoder.php の 98 行目のデータが認識される形式ではありません

そして私は得る:

致命的なエラー: 関数の最大ネスト レベル '100' に達しました。中止します! /opt/content/erik/omnicol/HTML/WS/services/qrDecoder/QrDecoder.php の 87 行目

この最後の問題は非常に簡単に解決できると思いますが、とにかく投稿すると思います。

さて、私の質問は次のとおりです。
私は正しい軌道に乗っていますか?
警告を解決するにはどうすればよいですか?

よろしくお願いします、
エリック

ps私の英語が下手ならごめんなさい。私はオランダ人なので、ネイティブスピーカーではありません。
ps2 私が話していたバグはこれです: http://markmail.org/message/iosbn3rbcgu5k6qt

編集: 最大 100 の深さのソリューションは、思ったよりも困難でした。そのため、それに関するヘルプも素晴らしいでしょう。

4

2 に答える 2

0

バイトごとにイメージを作成しようとしているのはなぜですか? そして、その再帰は何のためですか?文字列を実行して、それらの 2 バイトを修正することはできませんか? このようなもの:

function getValidBin($s) {
    $new_s = '';
    for ($i = 0; $i < strlen($bin) ; $i++)
    {
        $char = $s{$i};
        if (ord($char) > 127)
        {
            $char = chr(ord($char) + ord($s{$i}));
            $i++;
        }
        $new_s .= $char;
    }
}

すでに base64 でデコードされた文字列を入力する必要があります。

私はあなたのラインを仮定しました

$binT = $bin[$i] + $bin[$i+1];

「127を超える文字コードがある場合、これと次の文字コードを一緒に追加して単一の文字として使用する」ことを意味するはずでしたが、このアプローチが本当にあなたが望むものであると想定しました(私たちが知らないのでわかりません)あなたのデータがわからない)。

于 2010-12-01T11:16:47.757 に答える
0

この問題の解決策はありませんでした。
アプリケーションの JavaScript 側に切り替えて、そこでバイトを修正しました。

于 2011-03-01T11:04:23.427 に答える