从字节数组中确定x和y的高字节和低字节



我想使用他们的SDK将Android位图发送到打印机(移动蓝牙打印机Bixolon SPP R-200),我可以将位图转换为字节数组。出于参考目的(并了解我所了解的内容),请查看此处的Bixolon命令手册。我就是这样做的:

向打印机发送命令,告诉它我希望如何使用以下命令对齐打印输出(左=0,右=2,中=1):

    byte[] command = { 27, 97, 0 };

27和97是Bixolon命令手册中的命令-零表示"左对齐"。然后,我使用SDK write(byte[])命令将此命令发送到打印机(成功)。

下一步是我遇到麻烦的地方:我想向打印机发送"打印光栅位图像"命令,第一部分很容易:

    byte[] command2 = { 29, 118, 48, 0, 0, 0, 0, 0 };

29、118和48共同组成了一个名为"GS v 0"的命令(在使用上述数字的ascii转换图时进行直译),该命令在参考的Bixolon手册第126页中进行了描述。第一个零将水平和垂直DPI设置为203。

现在我遇到的问题是:根据手册,剩下的4个零必须替换为:

xL  xH  yL  yH  d1...d 

我假设它是x位置低字节、x位置高字节、y位置低字节等…(但不确定d1…d代表什么?)。

在SDK中,他们用以下代码填充最后4个字节:

    int width = myBitmap.getWidth();
    int height = myBitmap.getHeight();
    int bytesOfWidth = width / 8 + (width % 8 != 0 ? 1 : 0);
    dimensionCommand[4] = (byte) (bytesOfWidth % 256);
    dimensionCommand[5] = (byte) (bytesOfWidth / 256);
    dimensionCommand[6] = (byte) (height % 256);
    dimensionCommand[7] = (byte) (height / 256);

但我不明白为什么。这就是你计算x/y位置的高位和低位字节的方式吗?

然而,将此命令发送到打印机也可以,在最后一步中,我的位图(已转换为字节数组)也被成功传输(至少没有发生IO错误),但没有打印任何内容(尽管纸张移动,纸张左侧似乎打印了两个像素)。所以我怀疑上面对位图的x和y坐标的高字节和低字节的计算可能是错误的。。。

int bytesOfWidth = width / 8 + (width % 8 != 0 ? 1 : 0);
dimensionCommand[4] = (byte) (bytesOfWidth % 256);
dimensionCommand[5] = (byte) (bytesOfWidth / 256);

看起来可疑。我会对宽度和高度使用相同的计算方法。我还将使用逐位AND和位移位,而不是%/运算符,它们相比之下相当慢:

int width = myBitmap.getWidth();
int height = myBitmap.getHeight();
dimensionCommand[4] = (byte) (width & 0xFF);
dimensionCommand[5] = (byte) ((width >> 8) & 0xFF);
dimensionCommand[6] = (byte) (height & 0xFF);
dimensionCommand[7] = (byte) ((height >> 8) & 0xff);

失去bytesOfWidth计算,这没有意义。把宽度穿过就行了。

字节d1,d2,。。。d3之后的是光栅*d*ata。根据在线手册,该光栅数据是每个像素1字节,而不是我认为您之前的问题假设的1位。

最新更新