Google-Syntax

#include <iostream>;

using namespace std;

int main() {
  cout << "Hello World!";
  return 0;
}

Google-Syntaxというコードをハイライトさせるプラグインを入れました。どうやら中国の方が開発されているソフトで、Googleの情報を使用しているらしいのです。Wordpressのプラグインです。

同様のソフトには、有名な SyntaxHighlighterなどがありますが、少し気に入らないのは、Donateして下さい、というボタンが現れることです。たとえば、

といった具合ですどうですか? コードの右側に何やら小さな緑色のボタンが出ています

これに対して Google-Syntaxでは

  1. #include <iostream>
  2. using namespace std;
  3. int main() {
  4.   cout << “Hello World!”;
  5.   return 0;
  6. }

 

のように、出ていないでしょう?

JPEGハフマン・テーブル – 解読実践(17)

さて、ワード単位(16 bits単位)でのサーチはどうなるでしょうか?

これが結構ややこしい、何故ならば今度はワード単位なのでポインターもワードを指すのです。それに考慮すれば

typdef unsigned short u_short;     
  // これでu_shortというワード型を宣言した
std::vector <u_short> address;
  // u_charへのポインタをいれるvectorを宣言した
u_short *buffer = new u_short[bufSize/2]; 
  // ワードずつ確保なので半分
u_short *bufTop = buffer;
u_short *bufEnd = bufTop + bufSize/2;
u_short *bufPntr = bufTop;
 // 動き回るポインターを先頭にセット
fp.read(reinterpret_cast<char *> (buffer), bufSize);
 // ここではバイト単位でしか指定できないのでキャストした
while (bufPntr < bufEnd) {
  if (*bufPntr == 0xC4FF) {
    // DHT tagにヒットした
    address.push_back(bufPntr);
  }
  bufPntr++;
}
fp.close();
delete[] bufTop;

ちなみに u_shortとは unsigned shortであり、C/C++の規約上 16 bits整数を表すものです

JPEGハフマン・テーブル – 解読実践(16)

まずはファイルを読み込み、DHT tagの検出を行う部分を造りました。先日も書いたように、ここでは バイト単位でサーチするか ワード単位でサーチするかで少し変化します。ただ、どう考えてもワード単位サーチの方が速そうですが、理解が簡単なのでまずはバイト単位です。あくまでも標準C++を用いています

#include "stdafx.h"
#include <iostream>
#include <fstream>;
#include <vector>;
typedef unsigned char u_char;

int _tmain(int argc, _TCHAR* argv[])
{	
	if (argc != 2) {
		std::cout << "一つの引数が必要です\n";
		char ch = 'x';
		while (ch != 'e') {
			std::cin >> ch;
		}
		return false;
	}
	std::ifstream fp(argv[1], std::ios::in|std::ios::binary);
	if (fp.fail()) {
		std::cout << "エラー::そのような入力ファイルは存在しません\n";
		char ch = 'x';
		while (ch != 'e') {
			std::cin >> ch;
		}
		return false;
	}

	std::ifstream::pos_type begp, endp, fsize;
	std::vector<u_char *> address; // DHT tag位置記録用
	fp.seekg(0, std::ios_base::end);  // ファイルの最後に移動
	end = fp.tellg();  // endpにはファイルの最後の位置がセット
	fp.seekg(0, std::ios_base::beg);  // ファイルの最初に移動
	begp = fp.tellg();  // begpにはファイルの先頭位置がセットされた
	fsize = endp - begp;  // fsizeにはファイルサイズがセットされた
	long const bufSize = static_cast<long>(fsize);  // bufSizeはバッファの大きさ
	u_char * buffer = new u_char[bufSize];
	u_char * const bufTop1 = buffer1;
	u_char * bufPntr = bufTop;
	fp.read(reinterpret_cast<char *>(buffer), bufSize);	
	u_char * const bufEnd1 = bufTop + bufSize;
	while (bufPntr < bufEnd) {
		if (*bufPnt == 0xFF) {
			if (*(bufPntr+1) == 0xC4) {
				address.push_back(bufPntr);
			}
		}
		bufPntr1++;
	}

	fp.close();
	delete[] buffer;

	std::cout << "\nDHT tagバイト検索\n";
	std::vector<u_char *>::iterator it;
	for (it = address.begin(); it != address1.end(); ++it) {
		std::cout << std::showbase << std::hex << (*it - bufTop) << std::endl;
	}

	char ch = 'x';
	while (ch != 'e') {
		std::cin >> ch;
	}
	return 0;
}