ios 蓝牙打印图片乱码_ios 蓝牙打印 乱码 - CSDN
  • iOS Bluetooth 打印小票

    2016-06-14 11:32:53
    非常感谢 Haley_Wong 文章 http://www.jianshu.com/p/90cc08d11b5a  提供的github 地址 https://github.com/Haley-Wong/HLBluetoothDemo https://github.com/Haley-Wong/SEBLEPrinter   HLBluetoothDemo介绍

    效果图如下



      非常感谢 Haley_Wong 的帮助

      文章 

            http://www.jianshu.com/p/90cc08d11b5a

      github 地址 

           https://github.com/Haley-Wong/HLBluetoothDemo   

           https://github.com/Haley-Wong/SEBLEPrinter


      csdn 下载地址

           hlbluetoothDemo     SEBLEPrinterDemo

    HLBluetoothDemo介绍

    目前测试了三个型号的打印机:佳博 Gp-58MBIII和GP58MBIII和芯烨 XPrinter某型号,已可以正常打印文字和二维码。
    对比了佳博和芯烨的编码使用手册,它们使用的命令都是一样的。如果你用的不是这另个品牌的打印机,最好先对比一下使用的指令一致。

    该项目中包含两个部分的工具类HLBluetooth 和HLPrinter,蓝牙操作和打印小票功能。

    如果只是做蓝牙打印机打印小票的功能,可以看我的另一个工程SEBLEPrinter

    因为系统的蓝牙操作库是用delegate实现的,步骤比较繁多,操作很零散,需要写一堆的代理方法,特别麻烦 
    所以我用block方式重写了,蓝牙管理的所有代码在HLBluetooth目录中。

    又因为项目中要用蓝牙控制打印机打印下票,我又把蓝牙打印机的操作封装了一下,所有代码在HLPrinter目录下


    SEBLEPrinter

    iOS 蓝牙打印机库,侧重于打印部分,弱化蓝牙操作。

    更新

    添加了预览的功能。
    更新代码,修复一次打印的数据过多导致打印乱码的问题。解决方案,在写入前将数据拆分,然后分多次写入。
    当然也可以按照方式三,分多次打印。
    demo中已经给出分多次打印的示例代码。

    展开全文
  • 今天一直被字符编码的问题所困扰,上午刚刚解决了服务器PHP的编码问题,不过下午开发iOS客户端时又遇到了字符编码问题,这让我很困扰:PHP提供的借口URL,浏览器访问时返回的中文不乱码,当时iOS客户端却出现乱码: ...

    想想就觉得很坑,今天一直被字符编码的问题所困扰,上午刚刚解决了服务器PHP的编码问题,不过下午开发iOS客户端时又遇到了字符编码问题,这让我很困扰:PHP提供的借口URL,浏览器访问时返回的中文不乱码,当时iOS客户端却出现乱码:

    就这样,为这个问题反复百度、谷歌,却没有解决我的这个问题,最后,我遇到了一个,终于解决了,不过也不能说解决,而是知道了一个知识点:使用NSLog(@"%@",dict);直接打印包含中文的字典,会出现乱码。不过把中文单独提出来时却不是乱码。下面的实例可以说明:

    所以以后打印字典出现中文乱码的时候别以为是字符编码出现问题,当抽取单独中文时出现乱码才可能是字符编码问题。

    展开全文
  • 小程序连接蓝牙打印机打印文本与二维码等示例在 github 上都能找到一些,唯独打印图片这个案例几乎没有。最早在 CSDN 找到 微信小程序蓝牙连接 TSPL 打印机打印图片思路 这篇文章,代码完整性很缺,被坑一周。继续找...

    微信小程序连接蓝牙打印机示例

    示例完整的代码,请点击查看github

    小程序连接蓝牙打印机打印文本与二维码等示例在 github 上都能找到一些,唯独打印图片这个案例几乎没有。希望能帮助到有打印图片需求的小伙伴。

    • 测试打印机:凯盛诺 PTP-II-UBC 58mm 便携热敏打印机
    • 测试环境有:Android , IOS;其中 Android 和 IOS 在打印文本与二维码速率相对一致,但 IOS 打印图片几乎慢到无法打印的情况(听说蓝牙打印机在 IOS 中受限制,需要与 IOS 合作授权,在斑马品牌的一款打印机用 IOS 就能打印出来。即使是Android ,小程序打印图片比打印文本会慢许多,并不是打印机的问题,而是小程序只能使用低功率蓝牙,受限在一次发送20个字节的数据,需要分段递归发送,图片数据可以达到几万、几十万个字节。)
    • 打印机指令类型:ESC/POS 指令集 (打印机产家都会提供对应的指令文档,此demo 中使用十进制的数据格式的指令,十六进制的指令或者更多指令的使用方式可以参考另一个示例小程序蓝牙打印 miniprogram-bluetoothprinter)

    示例功能

    效果图

    Demo 中连接打印机的流程

    • 初始化蓝牙模块 wx.openBluetoothAdapter()
    • 初始化完成后搜寻附近的蓝牙设备 wx.startBluetoothDevicesDiscovery()
    • 监听寻找到新设备的事件 wx.onBluetoothDeviceFound()
    • 在监听寻找到新设备的事件回调中获取所有蓝牙设备列表 wx.getBluetoothDevices()
    • 连接低功耗蓝牙设备 wx.createBLEConnection()
    • 连接成功后获取蓝牙设备服务 wx.getBLEDeviceServices()
    • 在服务中取(notify=true || indicate=true) && write=true 的特征值的 uuid: wx.getBLEDeviceCharacteristics()
    • 完成后停止搜寻 wx.stopBluetoothDevicesDiscovery()
    • 向低功耗蓝牙设备特征值中写入二进制数据 wx.writeBLECharacteristicValue()
    • 离开页面时取消蓝牙连接 wx.closeBLEConnection()
    • 关闭蓝牙模块 wx.closeBluetoothAdapter()

    关于找蓝牙设备中能用的 Characteristic,这里贴出对应的代码,关注注释部分

    /**
     * 以Promise方式调用 微信api
     * @param {string} name 微信api的名称 ,如 wxAsyncPromise("getSystemInfo",options)
     * @param {object} options 除了success 和 fail 的其他参数
     * @returns
     */
    export function wxAsyncPromise(name, options) {
        return new Promise((resolve, reject) => {
            wx[name]({
                ...(options || {}),
                success: function(res) {
                    resolve(res);
                },
                fail: function(res) {
                    reject(res);
                },
            });
        });
    }
    //在多个服务services中递归查找能用的特征值
    //deviceId : 已连接的蓝牙设备id
    //services : wx.getBLEDeviceServices()取得的服务
    export function getDeviceCharacteristics(deviceId, services = [], success, fail) {
        services = services.slice(0);
        if (services.length) {
            const serviceId = services.shift().uuid;
            wxAsyncPromise('getBLEDeviceCharacteristics', {
                deviceId,
                serviceId,
            })
                .then((res) => {
                    console.log('getBLEDeviceCharacteristics', deviceId, serviceId, res);
                    let finished = false;
                    let write = false;
                    let notify = false;
                    let indicate = false;
                     //有斑马品牌的一款打印机中res.characteristics的所有uuid都是相同的,
                    //找所有的properties存在(notify || indicate) && write(如果只写入数据只要write=true也可以)这种情况就说明这个uuid是可用的
                    //(不确保所有的打印机都能用这种方式取得uuid,
                    //在凯盛诺打印机的res.characteristic只有一个uuid,所以也能用这个方式)
                    for (var i = 0; i < res.characteristics.length; i++) {
                        if (!notify) {
                            notify = res.characteristics[i].properties.notify;
                        }
                        if (!indicate) {
                            indicate = res.characteristics[i].properties.indicate;
                        }
                        if (!write) {
                            write = res.characteristics[i].properties.write;
                        }
                        if ((notify || indicate) && write) {
                            /* 获取蓝牙特征值uuid */
                            success &&
                                success({
                                    serviceId,
                                    characteristicId: res.characteristics[i].uuid,
                                });
                            finished = true;
                            break;
                        }
                    }
    
                    if (!finished) {
                        getDeviceCharacteristics(deviceId, services, success, fail);
                    }
                })
                .catch((res) => {
                    getDeviceCharacteristics(deviceId, services, success, fail);
                });
        } else {
            fail && fail();
        }
    }
    

    打印图片

    图片来源

    在 Demo 中手机选任意一张图片用 canvas 绘制,wx.canvasGetImageData()取得 Uint8ClampedArray 类型的图像像素点数据。

    位图数据

    需要把 Uint8ClampedArray 类型的数据转成打印机识别的点阵位图数据(也可以让后台实现图片转位图数据,参考热敏打印机编程 ESC/POS 指令)。

    不同打印机厂家的指令集可能不同,但打印图片的位图数据是一样的。

    贴出 Uint8ClampedArray 转位图数据的代码

    //灰度化处理
    function grayPixle(pix) {
        return pix[0] * 0.299 + pix[1] * 0.587 + pix[2] * 0.114;
    }
    /**
     * overwriteImageData
     * @param {object} data
     * {
                width,//图片宽度
                height,//图片高度
                imageData,//Uint8ClampedArray
        }
     */
    export function overwriteImageData(data) {
        let sendWidth = data.width,
            sendHeight = data.height;
        const threshold = data.threshold || 180;
        let sendImageData = new ArrayBuffer((sendWidth * sendHeight) / 8);
        sendImageData = new Uint8Array(sendImageData);
        let pix = data.imageData;
        const part = [];
        let index = 0;
        for (let i = 0; i < pix.length; i += 32) {
            //横向每8个像素点组成一个字节(8位二进制数)。
            for (let k = 0; k < 8; k++) {
                const grayPixle1 = grayPixle(pix.slice(i + k * 4, i + k * 4 + (4 - 1)));
                //阈值调整
                if (grayPixle1 > threshold) {
                    //灰度值大于threshold位   白色 为第k位0不打印
                    part[k] = 0;
                } else {
                    part[k] = 1;
                }
            }
            let temp = 0;
            for (let a = 0; a < part.length; a++) {
                temp += part[a] * Math.pow(2, part.length - 1 - a);
            }
            //开始不明白以下算法什么意思,了解了字节才知道,一个字节是8位的二进制数,part这个数组存的0和1就是二进制的0和1,传输到打印的位图数据的一个字节是0-255之间的十进制数,以下是用权相加法转十进制数,理解了这个就用上面的for循环替代了
            // const temp =
            //     part[0] * 128 +
            //     part[1] * 64 +
            //     part[2] * 32 +
            //     part[3] * 16 +
            //     part[4] * 8 +
            //     part[5] * 4 +
            //     part[6] * 2 +
            //     part[7] * 1;
            sendImageData[index++] = temp;
        }
        return {
            array: Array.from(sendImageData),
            width: sendWidth / 8,
            height: sendHeight,
        };
    }
    

    贴出递归发送二进制数据到蓝牙的代码

    /**
     * sendDataToDevice
     * @param {object} options
     * {
                deviceId,//蓝牙设备id
                serviceId,//服务id
                characteristicId,//可用特征值uuid
                value [ArrayBuffer],//二进制数据
                lasterSuccess,//最后完成的回调
        }
     */
    export function sendDataToDevice(options) {
        let byteLength = options.value.byteLength;
        //这里默认一次20个字节发送
        const speed = options.onceByleLength || 20;
        if (byteLength > 0) {
            wxAsyncPromise('writeBLECharacteristicValue', {
                ...options,
                value: options.value.slice(0, byteLength > speed ? speed : byteLength),
            })
                .then((res) => {
                    if (byteLength > speed) {
                        sendDataToDevice({
                            ...options,
                            value: options.value.slice(speed, byteLength),
                        });
                    } else {
                        options.lasterSuccess && options.lasterSuccess();
                    }
                })
                .catch((res) => {
                    console.log(res);
                });
        }
    }
    

    贴出发送逐行图片数据的代码

    /**
     * printImage
     * @param {object} opt
     * {
                deviceId,//蓝牙设备id
                serviceId,//服务id
                characteristicId,//可用特征值uuid
                lasterSuccess , //最后完成的回调
    	}
     * @param {object} imageInfo // 由overwriteImageData返回的对象
     */
    export function printImage(opt = {}, imageInfo = {}) {
        let arr = imageInfo.array,
            width = imageInfo.width;
        const writeArray = [];
        const xl = width % 256;
        const xh = width / 256;
        //分行发送图片数据,用的十进制指令
        const command = [29, 118, 48, 0, xl, xh, 1, 0];
        for (let i = 0; i < arr.length / width; i++) {
            const subArr = arr.slice(i * width, i * width + width);
            const tempArr = command.concat(subArr);
            writeArray.push(new Uint8Array(tempArr));
        }
        const print = (options, writeArray) => {
            if (writeArray.length) {
                sendDataToDevice({
                    ...options,
                    value: writeArray.shift().buffer,
                    lasterSuccess: () => {
                        if (writeArray.length) {
                            print(options, writeArray);
                        } else {
                            options.lasterSuccess && options.lasterSuccess();
                        }
                    },
                });
            }
        };
        print(opt, writeArray);
    }
    

    主要参考

    安利

    展开全文
  • kCFStringEncodingGB_18030_2000 打印中文是乱码 有demo或者 知道的吗 币不多 谢谢
  • 由于这个项目我只负责二维码打印,所以前面的蓝牙连接,文字打印我就不多说了,我自己也不是很清楚。不过有一点我是要说下的,要注意ios和安卓的不同,安卓一次只能写入不超过20字节(ios具体不清楚,当时代码交到我...

    会有很多算是废话的内容,但是都是我踩的坑,顺便记录下。(不一定适用所有的打印机,)

    由于这个项目我只负责二维码打印,所以前面的蓝牙连接,文字打印我就不多说了,我自己也不是很清楚。不过有一点我是要说下的,要注意ios和安卓的不同,安卓一次只能写入不超过20字节(ios具体不清楚,当时代码交到我手上是说只有二维码没写,后面才发现我的手机文字内容无法全部打印),建议是直接截取数据data.slice(20, byteLength),打印成功再次回调。

    我的项目需求是根据订单号生成二维码,然后二维码可以打印出来,生成二维码的话,建议使用weapp.qrcode.js (https://github.com/yingye/weapp-qrcode), 需要注意的是可能会有一个问题,text的值如果是变量的话,可能会打印出来空的二维码,我的问题是没有强制转成string,改成 text: String(orderNo),就可以了。

    好了,现在我们开始进入正题,首先来说下思路:

    首先我们需要读取二维码内容,然后把内容转成打印机认可的格式也就是ArrayBuffer,然后打印就好啦。

    好了,问题来了,读什么内容,怎么转换?(API自行去官方文档查看
    最开始我和我老大是不同的想法,我觉得我可以canvas画图生成二维码之后,将图片用wx.canvasToTempFilePath把内容导出生成指定大小的图片,然后保存图片wx.saveFile,然后读取文件内容wx.getFileSystemManager().readFile({}),正好返回的格式是ArrayBuffer,这不就出来了嘛,然而事实证明,我老大永远是我老大,我打印出来的是乱码。

    圈重点啦!

    老大和我说的是,我们需要读取得数据是像素点的 rgba,事实证明是的,我们要用的就是这个内容!用wx.canvasGetImageData

    接下来,我们改如何转换呢?
    嗯,接下来就是除了老大说,还有个参考网址,不过不是js代码的哦~(https://www.jianshu.com/p/dd6ca0054298)

    老大看着那个网址,原话不好说,大概就是,数据要4合1,然后8合1,大概就是这个意思吧。

    具体是这样的:

    1. 首先我们读取内容的APIwx.canvasGetImageData文档明确说明了,它的返回值是Uint8ClampedArray data,是图像像素点数据,一维数组,每四项表示一个像素点的 rgba;
    2. 然后要做黑白化!!这个时候就可以做4合1的内容了!我本来想着二维码不是黑就是白,肯定不是255就是0,其实还是会有一小部分是其他数值的,这个要注意哦!公式我用的另一个网址的公式,但是差不多,另外我投机取巧了一下,每4位是一个像素点的rgba,然后黑白色的rgb就是(0,0,0)和(255,255,255),所以我每四位只把第一位黑白化,然后将每四位的第一位取出来作为新的数组,当rule>200的时候,值取0,表示不打印,否则取1,表示打印;
    for (let i = 0; i < res.length; i++) {
      if (i % 4 == 0) {
        let rule = 0.29900 * res[i] + 0.58700 * res[i + 1] + 0.11400 * res[i + 2];
          if (rule > 200) {
            res[i] = 0;
          } else {
            res[i] = 1;
          }
          arr.push(res[i]);
      }
    }
    
    1. 4合1已经好了,接下来开始8合1,每8个像素点组成一个字节;下面的代码可能会有人不理解,举个例子:

    假如我们取出来的8位数是[0,0,0,0,0,0,0,1],这个时候8合1,我们需要进行进制转换,从右往左是2的零次方,2的一次方,等等,依次上加,实际是 0 * 27 + 0 * 26 + 0 * 25 + 0 * 24 + 0 * 23 + 0 * 22 + 0 * 21 + 1 * 20,这个数就是我们要的最终数据的其中之一。

    for (let k = 0; k < arr.length; k += 8) {
      let temp = arr[k] * 128 + arr[k + 1] * 64 + arr[k + 2] * 32 + arr[k + 3] * 16 + arr[k + 4] * 8 + arr[k + 5] * 4 + arr[k + 6] * 2 + arr[k + 7] * 1
      data.push(temp);
    }
    
    1. 差不多要到最后了,数据要准备打印了,直接打印?
      那肯定不可以!首先我们的数据还没有转换成ArrayBuffer,其次打印必须要有指令!参考网址以及标准的ESC-POS指令集,下面代码中的数字都是指令,另外,由于我这边的打印机支持的是gb2312格式,所以我在转成ArrayBuffer的同时,我还需要把编码格式转成正确的格式。

    toArrayBuffer()这个参考buffer,可以在小程序里npm,然后构建npm就好了,网址是:(https://www.npmjs.com/package/buffer),以及 文档:(https://nodejs.org/api/buffer.html)

    const cmds = [].concat([27, 97, 49], [29, 118, 48, 0, 20, 0, 160, 0], data, [27, 74, 3], [27, 64]);
    const buffer = toArrayBuffer(Buffer.from(cmds, 'gb2312'));
    

    好了,差不多就是这样了,整个流程!接下来直接调用wx.writeBLECharacteristicValue就好了。

    emmm,多说几个题外话,比如

    1. 我需要把二维码和文字内容合在一起,文字部分,
      let text = new encoding.TextEncoder("gb2312", { NONSTANDARD_allowLegacyEncoding: true }).encode(str).buffer;
      这就已经转成ArrayBuffer了,但是两个ArrayBuffer是不可用concat()方法拼接的,所以我可以少一点,
      let text = new encoding.TextEncoder("gb2312", { NONSTANDARD_allowLegacyEncoding: true }).encode(str);
      少个".buffer",这个时候的结果是Unit8Array,也和cmds不一样,所以再转一次,
      let newText = Array.from(text)
      好了现在cmds和newText都是普通的array了,concat()方法拼接好之后统一做一个
      toArrayBuffer(Buffer.from(finalArray, 'gb2312'));
    2. 最开始的时候,有个错误的想法,因为当初试验40 * 40的二维码是可以打印成功的,但是160 * 160就只能打印一部分,就在怀疑是不是因为data太大,所以才会不能打印完全二维码?
      我尝试了切割数据,进行处理,以小数组循环的方式进行打印,结果是乱码。所以不要随便切整合好的数组数据data,后来发现其实是其他问题,注意[29, 118, 48, 0, 20, 0, 160, 0]里的20160 !!这个要根据网址好好研究!

    **

    后补:重点来了,新坑!!

    当你二维码画出来之后,千万不要真机调试,预览成功后,直接去体验版测试!!捣鼓了半天,发现不是代码问题也是心累了。

    **
    根据各位兄弟问问的问题,我补点遗漏点吧

    1. toArrayBuffer ,是个组件,要安装的,https://www.npmjs.com/package/to-array-buffer 或者你用这种写法也可以const buffer = new Uint8Array(Buffer.from(cmds, 'gb2312')).buffer;
    2. 注意查看自己的数据是否正确,画图的数据有问题的话,也可能打印出黑块;
    3. 我之前画图那边没有贴出来,会在下面补上;
    4. 各位大哥请看我这里一眼,数据要算!!!要算!!要算!! ,比如我画图是160*160 ,然后我打印数据拼接的指令[29, 118, 48, 0, 20, 0, 160, 0]这个里面的20160 这个就是算的,参考我给的链接(https://www.jianshu.com/p/dd6ca0054298)看下原因,大概就是1:8,然后画图和读图的数据一致,大家都懂的吧;
    5. 打印数据!!!20字节一次!!wx.writeBLECharacteristicValue() 这个里面的value, 我是这样写的value: buffer.slice(0, 20),

    画图的

    const ctx = wx.createCanvasContext('canvas');
    ctx.clearRect(0, 0, 160, 160);
    qrcode = drawQrcode({
      canvasId: 'canvas',
      text: String('test'),
      width: 160,
      height: 160,
      callback(e) {
        setTimeout(() => {
          // 获取图片数据
          wx.canvasGetImageData({
         	canvasId: 'canvas',
            x: 0,
            y: 0,
            width: 160,
            height: 160,
            success(res) {}
    	  })
        }, 1000);
      }
    });                      
    
    展开全文
  • 之前使用过蓝牙打印机做餐饮小票功能,后来换了公司,没想到依旧逃脱不了轮回,做着做着,又是一个餐饮小票的APP丢过来,让我实现蓝牙打印这一块。吓得我赶紧把之前的Demo拿过来用,一打,傻眼了。。全是乱码是什么...

    转帖请注明原出处:http://blog.csdn.net/yezisuifengbiao/article/details/50923357

    之前使用过蓝牙打印机做餐饮小票功能,后来换了公司,没想到依旧逃脱不了轮回,做着做着,又是一个餐饮小票的APP丢过来,让我实现蓝牙打印这一块。吓得我赶紧把之前的Demo拿过来用,一打,傻眼了。。全是乱码是什么鬼?尝试了各类编码格式都不行。

    看了看型号,上网搜到是一家韩国的公司,对着型号进入相应的网页之后看到提示说需要Android与IOS的SDK需要联系该公司邮箱,进行索取,然而一个星期过去了,邮件至今未回复。搜遍了搜索引擎都未找到这家公司的SDK,后来想想,下载了他们公司的APK,进行反编译,找到SDK的包名进行搜索,最后在Git上面搜到一个餐饮的半成品项目,里面就有这个SDK。

    再根据反编译后的代码对照着去做,最终把项目功能做了出来。

    下面是打印效果

     

    具体项目会给出链接下载。其实很多的指令,还是与其他打印机相同的,但是少数有些差异。文档也压缩在压缩包里面了。

    并且一起打包了另外一个通用蓝牙打印机的源码以及文档,本文主要是想写给使用Woosim打印机时遇到问题的朋友,虽然我也不知道有几个人用。

    这台打印机比较特殊,仅支持编码 BIG-5、所以在BIG-5编码下的简体会变成"?"号。换了编码,例如gb2312,utf8等编码的话,会乱码。怪不得我之前使用的其他编码一直是乱码,加上打印图片的点阵算法也不同,不过好在人家已经封装好了,跟着做就行啦。

     

    点我下载源码

    展开全文
  • 项目需求,最近在玩蓝牙连接打印机,并实现打印功能的Demo
  • 这是一个算法,是我在做热敏打印机打印小票时解决的一个问题,想了想还是分享给大家,或许多大家有些许帮助。  在打印小票时,可能遇到一些字符串长度过长的问题,但是你不能直接截取,所以需要自动换行来显示全部...
  • 获取打印命令 -(NSData *)price_tscCommand{ TscCommand *command = [[TscCommand alloc]init]; [command addSize:40 :60]; [command addGapWithM:2 withN:0]; [command addReference:0 :0]; ...
  • 我升级之后,运行项目的时候控制台打印了一堆乱码 只需要在Xcode ->Product-> Scheme->Edit Scheme中配置OS_ACTIVITY_MODE为disable 权限的改动 在iOS10中调用摄像机和相册位置蓝牙等一系列
  • 1、蓝牙设备接入微信的基本条件 网上相对于这一块的资料不是特别多,而且有些博主整理的非常好的开发流程也会忽略很多东西,对于一个因为临时需求需要研究硬件设备的人来说太多没说明的坑。 在这里推荐一个链接: ...
  • SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机、32位ARM Cortex-M0处理器、128kB Flash存储器、以及丰富的数字接口。SYD8801片上集成了Balun无需阻抗匹配网络、高效率DCDC降压转换器,适合...
  • 世上最遥远的距离,是我在if里你在else里,似乎一直相伴又永远分离;世界上最痴心的等待,是我当case你是switch,或许永远都选不上自己;世界上最真情的相依,是你在try我在catch。无论你发神马脾气,我都默默接受,...
  • 文件夹 PATH 列表 卷序列号为 000A-8F50 E:. ...│ 使用说明.txt │ 免费下载更多源码.url │ 目录列表.txt │ ├─android web应用 │ jqmDemo_static.zip │ jqmMobileDemo-master.zip │ jqmMo
  • iOS 杂烩

    2016-08-20 12:16:26
    -(int)getRandomNumber:(int)from to:(int)to {  return (int)(from + (arc4random() % (to - from + 1))); }2 随机数 target *= 1000;2 *= 1000 即是乘与1000 ...@"2016-5-31"转为NSDat
  • HttpPrinter使用说明

    2019-06-15 20:23:33
    HttpPrinter 使用说明 (V1.0) 山东易桥智能科技有限公司网站: http://www.HttpPrinter.com http://www.yiqiao.net.cn 手机/微信:13165191728 QQ:46140262 群号: 2...
  • android蓝牙打印机

    2019-07-06 05:18:04
    您还未登录!|登录|注册|帮助 首页 业界 移动 云计算 研发 论坛 博客 下载 更多 reality_jie的专栏 ...CSDN2013年度博客之星评选文思海辉第一届在线编程大赛消灭0回答...
  • 【重要】Mac版HBuilder支持iOS10真机运行,解决32位Windows系统下iOS真机运行无法识别手机的问题 解决macOS Sierra系统下HBuilder某些情况下崩溃的问题 添加px转rem的提示功能,可在工具>>选项或右键项目>>属性下的...
  • github地址 系统控件 TextView 一个功能强大的TextView,可以满足日常大部分... 非常实用的省略控件,无emoji截断之乱码, 无characterstyle截断之不雅 歌词风格的 TextView,利用 Gradient 渐变实现 通过
1 2
收藏数 38
精华内容 15
关键字:

ios 蓝牙打印图片乱码