帖子
帖子
用户
博客
课程
1234下一页
返回列表 发新帖
8
帖子
0
勋章
63
Y币

可能理解错误了,我的问题和 https://community.apicloud.com/b ... hread&tid=58205 这个是一样的。我认为这个是早晚都是要改的,因为有越来越多的物联网应用开发需求,平台也需要这种功能来脱颖而出,提升竞争力。
380
帖子
4
勋章
6
Y币

你举个例子,发什么数据不行,设备给模块发,模块接收后,回调的数据有问题?
我这边测试看看。
C4 00 01  转成base64 是 Ag3qAwRFAgQBAw==  ?


8
帖子
0
勋章
63
Y币
技术支持-F 发表于 2018-4-13 19:04
你举个例子,发什么数据不行,设备给模块发,模块接收后,回调的数据有问题?
我这边测试看看。
C4 00 01  ...
  1. var buf = Buffer.from('020DEA03044502040103', 'hex');
  2. console.log(buf.toString('base64'));
  3. /* 这里是发送给设备的数据  Ag3qAwRFAgQBAw== 不用管*/

  4. //020D620021C51F04013434B5C40001580000000631323331313536353936353235360001010003  这里是设备返回的数据
  5. var base64Buffer = Buffer.from('Ag1BACHvv70fBAE0NO+/ve+/vQABWAAAAAYxMjMxMTU2NTk2NTI1NgABAQAD', 'base64'); /* 这里面的内容是复制的 apploader 打印出来的接收数据*/
  6. console.log(base64Buffer);
  7. /* 打印后出来数据  <Buffer 02 0d 41 00 21 ef bf bd 1f 04 01 34 34 ef bf bd ef bf bd 00 01 58 00 00 00 06 31 32 33 31 31 35 36 35 39 36 35 32 35 36 00 01 01 00 03>  0x80 以上的全变成 ef bf bd */
复制代码


我给做了案例,nodejs的
8
帖子
0
勋章
63
Y币
benjamin88 发表于 2018-4-10 18:21
fs 和 socketManager 这两个模块处理字节数据就是坑啊

不能使用fs,我们项自己开发个字节流操作插件,太心累了。
380
帖子
4
勋章
6
Y币
嘉喻 发表于 2018-4-14 10:27
我给做了案例,nodejs的

我给模块发送"Ag3qAwRFAgQBAw==", 模块返回的还是"Ag3qAwRFAgQBAw=="

我给模块发送"020D620021C51F04013434B5C40001580000000631323331313536353936353235360001010003",  模块返回的还是"020D620021C51F04013434B5C40001580000000631323331313536353936353235360001010003"
8
帖子
0
勋章
63
Y币
技术支持-F 发表于 2018-4-16 17:59
我给模块发送"Ag3qAwRFAgQBAw==", 模块返回的还是"Ag3qAwRFAgQBAw=="

我给模块发送"020D620021C51F04013 ...

还是理解错误了,我的业务流程是 socket(base64为真),向设备发“Ag3qAwRFAgQBAw==”,然后设备返回的是HEX字节流,不是字符串,“020D620021C51F04013434B5C40001580000000631323331313536353936353235360001010003”,这样子我的apploader 收到了“Ag1BACHvv70fBAE0NO+/ve+/vQABWAAAAAYxMjMxMTU2NTk2NTI1NgABAQAD”,然后我再用的我写的node.js那个案例解析,得到的“02 0d 41 00 21 ef bf bd 1f 04 01 34 34 ef bf bd ef bf bd 00 01 58 00 00 00 06 31 32 33 31 31 35 36 35 39 36 35 32 35 36 00 01 01 00 03”(用java测试也是一样的结果),很明显,接受到HEX字节流后对内容进行了识别,无法识别编码0x80以上字符,所以出现了问题,改起来应该很容易的,对base64直接与buffer互转,而不是转字符串就可以了。
20
帖子
1
勋章
7575
Y币
嘉喻 发表于 2018-4-17 10:15
还是理解错误了,我的业务流程是 socket(base64为真),向设备发“Ag3qAwRFAgQBAw==”,然后设备返回的 ...

把你java发16进制的代码发出来,包括16进制的内容,跟你帖子中描述一致的内容。
8
帖子
0
勋章
63
Y币
常山赵子云 发表于 2018-4-18 10:27
把你java发16进制的代码发出来,包括16进制的内容,跟你帖子中描述一致的内容。 ...
  1. public static void main(String[] args) {
  2.         String cmd = "Ag0CASHFHwQBNDS1xAABWAAAAAYxMjMxMTU2NTk2NTI1NgABAQADAk3QAgIABAM=";
  3.         String hexStr = base642Hex(cmd);
  4.         System.out.println(hexStr);
  5.     }


  6.     public static String hex2Base64(String hexStr){
  7.         byte[] hexes =   ByteUtils.fromHexAscii(hexStr);
  8.         return new String(Base64Utils.encode(hexes));
  9.     }


  10.     public static String base642Hex(String base64Str){
  11.         byte[] base64es =Base64Utils.decode(base64Str.getBytes());
  12.         return ByteUtils.toHexString(base64es);
  13.     }
复制代码
8
帖子
0
勋章
63
Y币

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;

public final class ByteUtils {

    private static final char[] HEX_CHARS = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
    public final static short UNSIGNED_MAX_VALUE = (Byte.MAX_VALUE * 2) + 1;

    public static short toUnsigned(byte b)
    {return (short) (b < 0 ? (UNSIGNED_MAX_VALUE + 1) + b : b);}

    public static String toHexAscii(byte b)
    {
        StringWriter sw = new StringWriter(2);
        addHexAscii(b, sw);
        return sw.toString();
    }

    public static String toHexAscii(byte[] bytes)
    {
        int len = bytes.length;
        StringWriter sw = new StringWriter(len * 2);
        for (int i = 0; i < len; ++i)
            addHexAscii(bytes, sw);
        return sw.toString();
    }

    public static byte[] byteMerger(byte[] byte_1, byte[] byte_2){
        byte[] byte_3 = new byte[byte_1.length+byte_2.length];
        System.arraycopy(byte_1, 0, byte_3, 0, byte_1.length);
        System.arraycopy(byte_2, 0, byte_3, byte_1.length, byte_2.length);
        return byte_3;
    }


    public static String toHexString(byte[] var0) {
        String var1 = "";

        for(int var2 = 0; var2 < var0.length; ++var2) {
            var1 = var1 + HEX_CHARS[var0[var2] >>> 4 & 15];
            var1 = var1 + HEX_CHARS[var0[var2] & 15];
        }

        return var1;
    }

    public static byte[] reverse(byte[] bytes)
    {
        int len = bytes.length;
        byte[] newBytes = new byte[len];
       for(int i=0;i<len;i++){
           newBytes = bytes[len-1-i];
       }

       return newBytes;
    }

    public static byte[] fromHexAscii(String s) throws NumberFormatException
    {
        try
        {
            int len = s.length();
            if ((len % 2) != 0)
                throw new NumberFormatException("Hex ascii must be exactly two digits per byte.");

            int out_len = len / 2;
            byte[] out = new byte[out_len];
            int i = 0;
            StringReader sr = new StringReader(s);
            while (i < out_len)
            {
                int val = (16 * fromHexDigit(sr.read())) + fromHexDigit(sr.read());
                out[i++] = (byte) val;
            }
            return out;
        }
        catch (IOException e)
        {throw new InternalError("IOException reading from StringReader?!?!");}
    }



    public static byte[] fromHexString(String var0) {
        char[] var1 = var0.toUpperCase().toCharArray();
        int var2 = 0;

        for(int var3 = 0; var3 < var1.length; ++var3) {
            if(var1[var3] >= 48 && var1[var3] <= 57 || var1[var3] >= 65 && var1[var3] <= 70) {
                ++var2;
            }
        }

        byte[] var6 = new byte[var2 + 1 >> 1];
        int var4 = var2 & 1;

        for(int var5 = 0; var5 < var1.length; ++var5) {
            if(var1[var5] >= 48 && var1[var5] <= 57) {
                var6[var4 >> 1] = (byte)(var6[var4 >> 1] << 4);
                var6[var4 >> 1] = (byte)(var6[var4 >> 1] | var1[var5] - 48);
            } else {
                if(var1[var5] < 65 || var1[var5] > 70) {
                    continue;
                }

                var6[var4 >> 1] = (byte)(var6[var4 >> 1] << 4);
                var6[var4 >> 1] = (byte)(var6[var4 >> 1] | var1[var5] - 65 + 10);
            }

            ++var4;
        }

        return var6;
    }

8
帖子
0
勋章
63
Y币
常山赵子云 发表于 2018-4-18 10:27
把你java发16进制的代码发出来,包括16进制的内容,跟你帖子中描述一致的内容。 ...

import org.springframework.util.Base64Utils;


base64utils 使用的是这个包,上面的程序是java base64转HEX字节流的测试代码
1234下一页
您需要登录后才可以回帖 登录

本版积分规则