Skip to content

decoder.hh

Zhiyuan "Erick" Li edited this page Jun 27, 2019 · 1 revision

decoder.hh

std::string grandDecoder(char *head, char *tail, bool enableLogging)

  • 功能 ⚙️

这个函数是阁下需要直接使用之函数,阁下只需要将二进制文件完整读取到内存中,并提供指针指向数据块之头尾。最终,阁下可以得到返回之jstring包含完整的符号信息。

  • 输入 📥
    • head :字符指针char *,需要指向内存中数据块的第一个字节;
    • tail :字符指针char *,需要指向内存中数据块的最后一个字节;
    • enableLogging:布尔值bool,决定是否要输出辅助日志。
  • 输出 📤
    • 字符串std::string,内容为完整之符号内容,使用JSON格式。
  • 注意 ⚠️

一定要注意tail乃是指向来自原二进制文件之最后一个字节,否则函数有机会出现未定义之行为。

void decodeColorPattern(char **cursor, std::string &jstring, int level, std::string color_type)

  • 功能 ⚙️

这个函数用于解码二进制文件中关于颜色定义的数据块。在ArcGIS中,颜色有三种定义方式,分别为RGB, HSVCMYK。如果阁下最初使用CMYK来定义颜色,那么此颜色在数据块只用4个字节表示,分别代表了CMYK四个部分;但是,如果其他用户最初使用RGBHSV来定义颜色,那么ArcGIS会使用24个字节的CIELab来表示颜色。

  • 输入 📥
    • cursor See Public Param
    • jstring See Public Param
    • level See Public Param
    • color_type:字符串std::string,表明颜色的类型名称,比如”outline color”。需要注意的是,由于此字符串将会被用于JSON中,因此本字符串会被camelCased。
  • jstring 键值对 🧲
"color_{colorType}": {
    "name": "{color_type}",
    "space": "[RGB, HSV, CMYK]",
    "rawColorCode": [
        10.222222222,
        11.333333333,
        12.444444444
    ],
    "colorCode": [
        23.453,
        91.83,
        1.342
    ]
}
* `name`:颜色类型名称;
* `space`:色彩模型名称,只可以为”RGB”, “HSV”, “CMYK”;
* `rawColorSpace`:为直接从数据块中读取到的浮点数内容(见注意);
* `colorSpace`:为最终颜色的模型。(见警告)
  • 注意 ⚠️

rawColorSpace只会在space为”RGB”及”HSV”时出现

  • 警告 ‼️

在”RGB”及”HSV”时,colorCode会有误差。由于ArcGIS使用的CIELab转换RGB之模型非标准模型,因此更深入的色彩研究非常有必要!

int decodeLayerNumber(char **cursor, std::string &jstring, int level)

  • 功能 ⚙️

此函数用于解码图层之数量。ArcGIS的符号中的图层就像Adobe Photoshop中的图层一样,互相独立。

  • 输入 📥
    • cursor See Public Param
    • jstring See Public Param
    • level See Public Param
  • 输出 📤
    • 整型数int,为图层数量。
  • jstring 键值对 🧲
"numberOfLayers": 2,
  • 注意 ⚠️

如果发现图层数目不是正整数,函数会丢出错误。

double decodeDouble(char **cursor, std::string &jstring, int level, std::string tag)

  • 功能 ⚙️

此函数用于解码数据块中的双精度浮点数。

  • 输入 📥
    • cursor See Public Param
    • jstring See Public Param
    • level See Public Param
    • tag:字符串std::string,表明此此浮点数的用途。
  • 输出 📤
    • 双精度浮点数double,为所解码之数字。
  • jstring 键值对 🧲
"{tag}": 4.37464,
  • 注意 ⚠️

写入jstring时,数字会舍去小数点后无意义的0

int decodeInt(char **cursor, std::string &jstring, int level, std::string tag)

  • 功能 ⚙️

此函数用于解码数据块中的整型数。

  • 输入 📥
    • cursor See Public Param
    • jstring See Public Param
    • level See Public Param
    • tag:字符串std::string,表明此此整型数的用途。
  • 输出 📤
    • 整型数int,为所解码之数字。
  • jstring 键值对 🧲
"{tag}": 5,

void decodeString(char **cursor, std::string &jstring, int level, std::string tag)

  • 功能 ⚙️

此函数用于解码数据块中的字体名称(字符串)。

  • 输入 📥
    • cursor See Public Param
    • jstring See Public Param
    • level See Public Param
  • jstring 键值对 🧲
"fontName": [
    87,
    105,
    103,
    100,
    105,
    110,
    103,
    115
]
  • 注意 ⚠️

字体名称使用名称中字符所对应的Unicode组成为列表。英文字体名称中,一个字符占用一个字节;而在中文字体名称中,一个中文字占用两个字节。