バイナリで見て、なんかめっちゃデータが詰まっているところを4バイトずつfloatで取り出すとy座標(強度)のデータが取れた。

そのデータ範囲のアドレスをバイナリで直接確認し、その範囲だけ取り出すようにしたためこのページの一番下に載せたコードに汎用性はない…

一応他にテキストデータに変換したものがあり、それと測定波長の範囲が同じためx座標(波長)のデータはそれに合わせた。

Excelでプロットしたらちゃんと取り出せていた。

https://gist.github.com/akira093/5029330

このソフトを使おうと思ったが使い方が分からなかった…

このソフトを作った人が参考にしていたソフトを調べて使おうと思ったが、pythonのバージョンとライブラリが合わなく諦めた。

https://web.archive.org/web/20201104155819/https://sites.google.com/site/victorhr02/jwsprocessor

マジでpythonきらい。

日本分光(JASCO)のjwsのファイルフォーマットを理解しなくては。

まあもう取り出せたからいいんだけど。


”JWS JASCO”で検索したら

jws2txt

変換するpythonコードがまた出てきた。

あとで確認しよう。

jasco_jws_reader

他にもあったわ。


#include <stdio.h>
#include <string.h>

void convertFile(const char *inputFileName) {
    FILE *fp = fopen(inputFileName, "rb");

    char outputFileName[256];  // 出力ファイル名を格納するバッファ

    // 入力ファイルの拡張子を除いた部分を取得
    strncpy(outputFileName, inputFileName, sizeof(outputFileName));
    char *dot = strrchr(outputFileName, '.');
*dot=0;
    // 出力ファイル名に ".txt" を追加
    strcat(outputFileName, ".txt");

    FILE *fp2 = fopen(outputFileName, "w");

    fseek(fp, 0xC00, SEEK_SET);

    while (1) {
        char a[4];
        int err = fread(a, sizeof(char), 4, fp);
        if (err <= 0) break;
        if (ftell(fp) > 0x27AF) break;

        // 変数aをfloatに変換して書き込む
        float value;
        memcpy(&value, a, sizeof(float));
        fprintf(fp2, "%.8lf\n", value);
    }

    fclose(fp);
    fclose(fp2);
}

int main(int argc, char *argv[]) {
    // 引数がない場合、メッセージを表示して終了
    if (argc <= 1) {
        printf("Usage: %s input_file1 input_file2 ...\n", argv[0]);
        return 1;
    }

    // ドラッグアンドドロップされたファイルごとに処理
    for (int i = 1; i < argc; ++i) {
        convertFile(argv[i]);
    }

    return 0;
}