分享一个decodeHex代码,顺便问下decodeAi7Thumbnail,有谁熟悉,请教一下

hongwenjun 2013-06-10 01:26:17
#include <iostream>
#include <string>
#include <windows.h>>
#include <stdio.h>

using namespace std;

// 从别人代码里移植,还没调试正确
string decodeHex(const byte* src, long srcSize)
{


// 00000030h: 00 01 02 03 04 05 06 07 08 09 10 10 10 10 10 10 ;
// 00000040h: 10 0D 0A 0B 0C 0D 0E 0F 10 10 10 10 10 10 10 10 ;
// 00000050h: 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 ;
// 00000060h: 10 10 0D 0A 0B 0C 0D 0E 0F 10 10 10 10 10 10 10 ;
// create decoding table
byte invalid = 16;
byte decodeHexTable[256];
for (long i = 0; i < 256; i++) decodeHexTable[i] = invalid;
for (byte i = 0; i < 10; i++) decodeHexTable[static_cast<byte>('0') + i] = i;
for (byte i = 0; i < 6; i++) decodeHexTable[static_cast<byte>('A') + i] = i + 10;
for (byte i = 0; i < 6; i++) decodeHexTable[static_cast<byte>('a') + i] = i + 10;


// calculate dest size
long validSrcSize = 0;
for (long srcPos = 0; srcPos < srcSize; srcPos++) {
if (decodeHexTable[src[srcPos]] != invalid) validSrcSize++;
}
const long destSize = validSrcSize / 2;

// allocate dest buffer
string dest('a', destSize);

// decode
for (long srcPos = 0, destPos = 0; destPos < destSize; destPos++) {
byte buffer = 0;
for (int bufferPos = 1; bufferPos >= 0 && srcPos < srcSize; srcPos++) {
byte srcValue = decodeHexTable[src[srcPos]];
if (srcValue == invalid) continue;
buffer |= srcValue << (bufferPos * 4);
bufferPos--;
}
dest[destPos] = buffer;
}

return dest;
}


int main()
{
const char* hexs =
"%0066000066330066660066990066CC0066FF009900009933009966009999"
"%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66"
"%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333";

string str = decodeHex((BYTE*)hexs , 240);
cout << hexs;
FILE* pFile;
pFile = fopen("myfile.bin" , "wb");
fwrite(str.c_str() , 1 , str.size(), pFile);
return 0;
}


#if(0)
/*!
@brief Decode a Hex string.
*/
DataBuf decodeHex(const byte* src, long srcSize);


/*!
@brief Decode an Illustrator thumbnail that follows after %AI7_Thumbnail.
*/
DataBuf decodeAi7Thumbnail(const DataBuf& src);

== == == == == == == == == == == == == == == == == == == =

DataBuf decodeHex(const byte* src, long srcSize)
{
// create decoding table
byte invalid = 16;
byte decodeHexTable[256];
for (long i = 0; i < 256; i++) decodeHexTable[i] = invalid;
for (byte i = 0; i < 10; i++) decodeHexTable[static_cast<byte>('0') + i] = i;
for (byte i = 0; i < 6; i++) decodeHexTable[static_cast<byte>('A') + i] = i + 10;
for (byte i = 0; i < 6; i++) decodeHexTable[static_cast<byte>('a') + i] = i + 10;

// calculate dest size
long validSrcSize = 0;
for (long srcPos = 0; srcPos < srcSize; srcPos++) {
if (decodeHexTable[src[srcPos]] != invalid) validSrcSize++;
}
const long destSize = validSrcSize / 2;

// allocate dest buffer
DataBuf dest(destSize);

// decode
for (long srcPos = 0, destPos = 0; destPos < destSize; destPos++) {
byte buffer = 0;
for (int bufferPos = 1; bufferPos >= 0 && srcPos < srcSize; srcPos++) {
byte srcValue = decodeHexTable[src[srcPos]];
if (srcValue == invalid) continue;
buffer |= srcValue << (bufferPos * 4);
bufferPos--;
}
dest.pData_[destPos] = buffer;
}
return dest;
}


DataBuf decodeAi7Thumbnail(const DataBuf& src)
{
const byte* colorTable = src.pData_;
const long colorTableSize = 256 * 3;
if (src.size_ < colorTableSize) {
#ifndef SUPPRESS_WARNINGS
EXV_WARNING << "Invalid size of AI7 thumbnail: " << src.size_ << "\n";
#endif
return DataBuf();
}
const byte* imageData = src.pData_ + colorTableSize;
const long imageDataSize = src.size_ - colorTableSize;
const bool rle = (imageDataSize >= 3 && imageData[0] == 'R' && imageData[1] == 'L' && imageData[2] == 'E');
std::string dest;
for (long i = rle ? 3 : 0; i < imageDataSize;) {
byte num = 1;
byte value = imageData[i++];
if (rle && value == 0xFD) {
if (i >= imageDataSize) {
#ifndef SUPPRESS_WARNINGS
EXV_WARNING << "Unexpected end of image data at AI7 thumbnail.\n";
#endif
return DataBuf();
}
value = imageData[i++];
if (value != 0xFD) {
if (i >= imageDataSize) {
#ifndef SUPPRESS_WARNINGS
EXV_WARNING << "Unexpected end of image data at AI7 thumbnail.\n";
#endif
return DataBuf();
}
num = value;
value = imageData[i++];
}
}
for (; num != 0; num--) {
dest.append(reinterpret_cast<const char*>(colorTable + (3 * value)), 3);
}
}
return DataBuf(reinterpret_cast<const byte*>(dest.data()), static_cast<long>(dest.size()));
}



#endif
...全文
400 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hongwenjun 2016-02-07
  • 打赏
  • 举报
回复
引用 4 楼 xuewutianya1219 的回复:
正好也在做这个,这个Hex的解码您搞定了吗?求分享
好像解码好了
桓灭 2015-07-30
  • 打赏
  • 举报
回复
正好也在做这个,这个Hex的解码您搞定了吗?求分享
hongwenjun 2013-06-13
  • 打赏
  • 举报
回复
自己强搞,总算可以搞出 BMP了 https://code.google.com/p/srgb/source/browse/decodeAi7Thumbnail/decodeAi7Thumbnail.cpp
BITMAPFILEHEADER bmph = {0x4D42, 54 , 0, 0, 54 };   // 14字节
    BITMAPINFOHEADER bmpinf = {40, 76, 128, 1, 24, 0 , 0, 0, 0, 0, 0    }; // 40字节

    bmph.bfSize += bgr.size();
 //   bmpinf.biWidth  = x;
 //   bmpinf.biHeight = y;


    FILE* bmpfile;
    bmpfile = fopen("bgr.bmp" , "wb");

    fwrite(&bmph , 1, 14,   bmpfile);
    fwrite(&bmpinf , 1, 40,   bmpfile);

    // 由于前面解码的数据是RGB标准数据,而BMP存储为BGR顺序
    // 由于BMP写文件最下面先读写,要翻转
    for (int i = 0 ; i < bgr.size() ; i += 3) {
        swap(bgr[i] , bgr[i + 2]);
    }
    int x = 76; int y = 128;
    const char* px = bgr.c_str();
    for (int i = y  ; i > 0 ; i--) {
        fwrite(px + 3 * i * x  , 1 , 3 * x, bmpfile);
    }
hongwenjun 2013-06-10
  • 打赏
  • 举报
回复
需要解码 %AI7_Thumbnail: 128 108 8 这个标记 里 128x108 8bit的图片预览 https://github.com/jmue/exiv2 https://github.com/jmue/exiv2/blob/a2e75c176fe9228d967eee02181446d5fba93eab/src/preview.cpp 别人已经发我 实现代码的开源示例 自己能力不够,才能基本阅读 decodeHex代码 部分,改成写 bin数据 返回一个到 string字符串

///*****************************  低版本  AI EPS文件缩略图 分析      *********************************///

10 0 obj<</Length 13367>>stream
%%BoundingBox: -1 -1 1511 1262
%%HiResBoundingBox: -0.1079 -0.416 1510.9756 1261.5264
%AI7_Thumbnail: 128 108 8
%%BeginData: 13211 Hex Bytes
%0000330000660000990000CC0033000033330033660033990033CC0033FF
%0066000066330066660066990066CC0066FF009900009933009966009999
%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66
%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333
%3333663333993333CC3333FF3366003366333366663366993366CC3366FF
%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99
%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033
%6600666600996600CC6600FF6633006633336633666633996633CC6633FF
%6666006666336666666666996666CC6666FF669900669933669966669999
%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33
%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF
%9933009933339933669933999933CC9933FF996600996633996666996699
%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33
%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF
%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399
%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933
%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC
%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699
%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33
%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100
%000011111111220000002200000022222222440000004400000044444444
%550000005500000055555555770000007700000077777777880000008800
%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB
%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF
%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF
%524C45527DA8A8A87C767DA8A8A8A1FD08A87D527DA1FD07A8A1FD09A87D
%5252FD07A8A1A8A1A8A1FD06A8A727527DFD09A8A1FD07A8A17D52FD09A8
%A1FD09A876527DFD07A8A1A8A2A8A2A8527DA1A8A87D2752FD05FFCBFFCA

// ------------------------中间省略-----------------------------

%FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
%FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFFFFFA8FFFFFFA8
%FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
%FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
%%EndData
endstream
endobj

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧