0

そこで、私は単純なステガノグラフィツール(画像内のメッセージを暗号化する)を作成し、Node.jsを介してWebサービスとして公開しています。私は特にJavascriptとNode.jsに非常に慣れていません。アプリは最初に、各文字を8ビットASCIIエンコーディングに変更することにより、テキスト文字列をバイナリ文字列に変換し、1つの大きなバイナリ文字列を生成します。次に、ピクセル内のメッセージを暗号化します。ピクセルの偶数値はバイナリからの0を表し、奇数値は1を表します。文字列の終わりは、値100の3ピクセルとして連続してマークされます(これは、終わりをマークするためのより良い方法がわかるまで、一時的なものです)。png画像へのピクセルレベルのアクセスを提供する「pngjs」というnode.jsライブラリを使用しています。

そのため、decodeMessage関数に問題があります。文字列メッセージを作成し、それを返すことを目的としていますが、最後のreturn呼び出しは未定義になります。

どうすれば修正できますか?

助けてくれてありがとう!

function encodeMessage(image, mes) {

    var message = mes;

    var fs = require('fs'),
    PNG = require('pngjs').PNG;

    fs.createReadStream(image)
    .pipe(new PNG({
        filterType: 4
    }))
    .on('parsed', function() {

        for (var y = 0; y < this.height; y++) {
            for (var x = 0; x < this.width; x++) {
                var idx = (this.width * y + x);// << 2;
                //console.log(idx); 
                if (idx < message.length) {

                    var item = message.charAt(idx);

                    /* if the character in the encoded string is 0 */
                    if (item == 0) {
                        /* if the pixel is odd, we want it to be even */
                        if (this.data[idx] % 2 == 1) {
                        /* if the pixel is 0, add 1 to it */
                        if (this.data[idx] == 0) {
                            this.data[idx] = this.data[idx] + 1;
                        } else {
                            /* else substract 1 */
                            this.data[idx] = this.data[idx] - 1;
                        }
                        }
                    } else {
                        /* if the character in the encoded string is 1 */
                        if (this.data[idx] % 2 == 0) {
                        if (this.data[idx] == 0) {
                            this.data[idx] = this.data[idx] + 1;
                        } else {
                            this.data[idx] = this.data[idx] - 1;
                        }
                        }
                    }

                    //console.log(this.data[idx]);

                } else if (idx === message.length) {

                    /* do something to the first pixel following the end of the string */
                    this.data[idx] = 100;
                    this.data[idx+1] = 100;
                    this.data[idx+2] = 100;
                    //console.log(this.data[idx]);

                } else {

                    /* do something to the remaining pixels */

                }                  
            }
        }
        this.pack().pipe(fs.createWriteStream('encoded_' + image));
    });
}

function decodeMessage(image) {
    var message = "";

    var fs = require('fs'),
    PNG = require('pngjs').PNG;

    fs.createReadStream(image)
    .pipe(new PNG({
        filterType: 4
    }))
    .on('parsed', function() {


        dance:
        for (var y = 0; y < this.height; y++) {
            for (var x = 0; x < this.width; x++) {

                var idx = (this.width * y + x);// << 2;

                if (this.data[idx] == 100 && this.data[idx+1] == 100 && this.data[idx+2] == 100) {
                    break dance;
                } else {

                    if (this.data[idx] % 2 == 0) {
                        message += "0";
                    } else {
                        message += "1";
                    }

                }

            }
        }
        /* the message outputs correctly over here */
        console.log(message);
        //return message;
    });

    /* but the return of the variable here doesn't work */
    return message;
}

exports.encodeMessage = encodeMessage;
exports.decodeMessage = decodeMessage;
4

1 に答える 1

1

parsedイベントは非同期で発生するため、から値を返すことはできませんdecodeMessage

function decodeMessage(image, cb) {

  // Code
  .on('parsed', function() {
    // Code

    console.log(message);
    cb(message);
  });
}

次に、関数にコールバックを渡す必要がありますdecodeMessage

decodeMessage(image, function(decoded){
  // Here is the decoded data.
});

同じことがあなたの関数にも当てはまりますencodeMessage。関数は、エンコードが完了する前に戻ります。それがいつ行われたかを知りたい場合は、同じ方法でコールバックを渡す必要があります。

于 2013-03-19T03:10:52.390 に答える