求大牛解释这段代码(与打印,ESC/POS指令,字体文件有关)

jqncc 2012-12-04 09:58:38
原有C#系统代码,小票打印机利用esc/pos指令打印,但原代码利用一种特殊方式可以直接在没有中文字库的打印机上打印中文,这段代码看不懂,主要代码如下:


private Byte[] m_commandBuffer = { 27, 42, 32, 24, 0 }; //指令 设置图形点阵,打印密度

//打印字符串方法
protected override void PrintString(String textData)
{
int messageLength = textData.Length;

for (int index = 0; index < messageLength; index++)
{
Char character = textData[index];
Byte[] fontBuffer = null;

fontBuffer = GetGaphicFontPixels(character);

if (fontBuffer == null)
{
//non printable characters
fontBuffer = new Byte[1];
fontBuffer[0] = System.Convert.ToByte('?');
}
else
{
m_commandBuffer[3] = System.Convert.ToByte(fontBuffer.Length / 3);
m_output.Write(m_commandBuffer, 0, m_commandBuffer.Length);
}

m_output.Write(fontBuffer, 0, fontBuffer.Length);
}// loop through all characters
}

//主要是这个方法
private Byte[] GetGaphicFontPixels(Char characterCode)
{
int fontIndex = 0;
Byte[] pixelBuffer = null;

if ((characterCode >= 0x0020) && (characterCode <= 0x00FF))
{
//General punctuation
fontIndex = characterCode - 0x0020;
pixelBuffer = Font0020_MingLiu_12x24.CharacterCode[fontIndex];
}
else if ((characterCode >= 0x2000) && (characterCode <= 0x206F))
{
//General punctuation
fontIndex = characterCode - 0x2000;
pixelBuffer = Font2000_MingLiu_24x24.CharacterCode[fontIndex];
}
else if ((characterCode >= 0x4E00) && (characterCode <= 0x4FFF))
{
fontIndex = characterCode - 0x4E00;
pixelBuffer = Font4E00_MingLiu_24x24.CharacterCode[fontIndex];
}
else if ((characterCode >= 0x5000) && (characterCode <= 0x5FFF))
{
fontIndex = characterCode - 0x5000;
pixelBuffer = Font5000_MingLiu_24x24.CharacterCode[fontIndex];
}
else if ((characterCode >= 0x6000) && (characterCode <= 0x6FFF))
{
fontIndex = characterCode - 0x6000;
pixelBuffer = Font6000_MingLiu_24x24.CharacterCode[fontIndex];
}
else if ((characterCode >= 0x7000) && (characterCode <= 0x7FFF))
{
fontIndex = characterCode - 0x7000;
pixelBuffer = Font7000_MingLiu_24x24.CharacterCode[fontIndex];
}
else if ((characterCode >= 0x8000) && (characterCode <= 0x8FFF))
{
fontIndex = characterCode - 0x8000;
pixelBuffer = Font8000_MingLiu_24x24.CharacterCode[fontIndex];
}
else if ((characterCode >= 0x9000) && (characterCode <= 0x9FAE))
{
fontIndex = characterCode - 0x9000;
pixelBuffer = Font9000_MingLiu_24x24.CharacterCode[fontIndex];
}
return pixelBuffer;
}


类似Font2000_MingLiu_24x24 这些类里都定义了很多个十六进制数组.我截取一部分

static class Font4E00_MingLiu_24x24
{
public static readonly Byte[][] CharacterCode ={
new Byte[] {0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00}
, new Byte[] {0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x06, 0x20, 0x00, 0x04, 0x3F, 0xFF, 0xFC, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00}
, new Byte[] {0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x30, 0x00, 0x21, 0xE0, 0x00, 0x2F, 0x20, 0x00, 0x38, 0x20, 0x00, 0x20, 0x20, 0x08, 0x20, 0x20, 0x04, 0x20, 0x20, 0x04, 0x20, 0x20, 0x04, 0x20, 0x20, 0x06, 0x20, 0x20, 0x04, 0x20, 0x20, 0x0C, 0x20, 0x20, 0x78, 0x20, 0x3F, 0xC0, 0x20, 0x38, 0x00, 0x20, 0x20, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00}
, new Byte[] {0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x1F, 0xFF, 0xF0, 0x10, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x40, 0x10, 0x00, 0x40, 0x10, 0x00, 0x40, 0x10, 0x00, 0x40, 0x10, 0x00, 0x40, 0x10, 0x00, 0x40, 0x30, 0x00, 0x81, 0xF0, 0x01, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00}
, new Byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0xFF, 0xF8, 0x40, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00}
, new Byte[] {0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00}
, new Byte[] {0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x20, 0x00, 0x10, 0x20, 0x00, 0x20, 0x20, 0x00, 0xC0, 0x20, 0x03, 0x00, 0x20, 0x3C, 0x00, 0x3F, 0xE0, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00}
...全文
428 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
图灵狗 2012-12-05
  • 打赏
  • 举报
回复
应该是通过外部工具产生的数据,就是说会由一个工具专门用于从系统字库中提取点阵信息,产生出自己的格式给程序进行调用。如果是单色点阵数据的话,那么你可以大致上试的出来,比如24x24,一般的做法是一个字节表示8个点,一行3个字节,共24行。
引用 3 楼 jqncc 的回复:
引用 2 楼 turingo 的回复:Font2000_MingLiu_24x24里面存储的就是24x24字库的点阵数据啊。 请问2楼这些点阵数据怎么来的怎么用啊,因为他这有两种这些东西使用的方法都不一样
jqncc 2012-12-05
  • 打赏
  • 举报
回复
引用 2 楼 turingo 的回复:
Font2000_MingLiu_24x24里面存储的就是24x24字库的点阵数据啊。
请问2楼这些点阵数据怎么来的怎么用啊,因为他这有两种这些东西使用的方法都不一样
图灵狗 2012-12-04
  • 打赏
  • 举报
回复
Font2000_MingLiu_24x24里面存储的就是24x24字库的点阵数据啊。
jqncc 2012-12-04
  • 打赏
  • 举报
回复
无大牛知道么?难道发错地方了

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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