64,683
社区成员
发帖
与我相关
我的任务
分享
#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
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);
}
///***************************** 低版本 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