精华内容
下载资源
问答
  • avascript通过ArrayBuffer和DataView实现字节数组和数字之间的相互转换 注意!我这里的所有函数用的都是大端字节序(高位在前,低位在后),即数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高...

    avascript通过ArrayBuffer和DataView实现字节数组和数字之间的相互转换

    注意!我这里的所有函数用的都是大端字节序(高位在前,低位在后),即数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中

    举例:2个字节的无符号整型1的二进制表示

    大端模式: 0000 0000 0000 0001

    小端模式: 0000 0001 0000 0000

    如果字节序不一致,解析的数据就会出错!如果你的数据是小端模式,就需要翻转数组,或者重写这些函数,DataView的setInt32和getInt32之类的函数可以传入一个参数来控制大端还是小端,我采用的是默认的情况下的大端模式

    具体代码如下

        test();
        function test() {
            var bytes = getFloat64Bytes(-3.33);
            alert(bytes);
            alert(toFloat64(bytes));
        }
        //构建一个视图,把字节数组写到缓存中,索引从0开始,大端字节序
        function getView(bytes) {
            var view = new DataView(new ArrayBuffer(bytes.length));
            for (var i = 0; i < bytes.length; i++) {
                view.setUint8(i, bytes[i]);
            }
            return view;
        }
        //将字节数组转成有符号的8位整型,大端字节序
        function toInt8(bytes) {
            return getView(bytes).getInt8();
        }
        //将字节数组转成无符号的8位整型,大端字节序
        function toUint8(bytes) {
            return getView(bytes).getUint8();
        }
        //将字节数组转成有符号的16位整型,大端字节序
        function toInt16(bytes) {
            return getView(bytes).getInt16();
        }
        //将字节数组转成无符号的16位整型,大端字节序
        function toUint16(bytes) {
            return getView(bytes).getUint16();
        }
        //将字节数组转成有符号的32位整型,大端字节序
        function toInt32(bytes) {
            return getView(bytes).getInt32();
        }
        //将字节数组转成无符号的32位整型,大端字节序
        function toUint32(bytes) {
            return getView(bytes).getUint32();
        }
        //将字节数组转成32位浮点型,大端字节序
        function toFloat32(bytes) {
            return getView(bytes).getFloat32();
        }
        //将字节数组转成64位浮点型,大端字节序
        function toFloat64(bytes) {
            return getView(bytes).getFloat64();
        }
    
        //将数值写入到视图中,获得其字节数组,大端字节序
        function getUint8Array(len, setNum) {
            var buffer = new ArrayBuffer(len);  //指定字节长度
            setNum(new DataView(buffer));  //根据不同的类型调用不同的函数来写入数值
            return new Uint8Array(buffer); //创建一个字节数组,从缓存中拿取数据
        }
        //得到一个8位有符号整型的字节数组,大端字节序
        function getInt8Bytes(num) {
            return getUint8Array(1, function (view) { view.setInt8(0, num); })
        }
        //得到一个8位无符号整型的字节数组,大端字节序
        function getUint8Bytes(num) {
            return getUint8Array(1, function (view) { view.setUint8(0, num); })
        }
        //得到一个16位有符号整型的字节数组,大端字节序
        function getInt16Bytes(num) {
            return getUint8Array(2, function (view) { view.setInt16(0, num); })
        }
        //得到一个16位无符号整型的字节数组,大端字节序
        function getUint16Bytes(num) {
            return getUint8Array(2, function (view) { view.setUint16(0, num); })
        }
        //得到一个32位有符号整型的字节数组,大端字节序
        function getInt32Bytes(num) {
            return getUint8Array(4, function (view) { view.setInt32(0, num); })
        }
        //得到一个32位无符号整型的字节数组,大端字节序
        function getUint32Bytes(num) {
            return getUint8Array(4, function (view) { view.setUint32(0, num); })
        }
        //得到一个32位浮点型的字节数组,大端字节序
        function getFloat32Bytes(num) {
            return getUint8Array(4, function (view) { view.setFloat32(0, num); })
        }
        //得到一个64位浮点型的字节数组,大端字节序
        function getFloat64Bytes(num) {
            return getUint8Array(8, function (view) { view.setFloat64(0, num); })
        }
    
        下面几个为另一种实现方式的版本,只实现了简单几种,其他的实现起来比较麻烦,所以就中途放弃了
        //function toInt32(bytes) {
        //    return ((bytes[0] & 0xFF) << 24) | ((bytes[1] & 0xFF) << 16) | ((bytes[2] & 0xFF) << 8) | (bytes[3] & 0xFF);
        //}
        //function toUInt16(bytes) {
        //    return ((bytes[0] & 0xFF) << 8) | (bytes[1] & 0xFF);
        //}
        //function toInt16(bytes) {
        //    return bytes[0] >> 7 == 0 ? toUInt16(bytes) : toUInt16(bytes) - 65536;
        //}
        //function getInt32Bytes(num) {
        //    return [num >> 24 & 0xFF, num >> 16 & 0xFF, num >> 8 & 0xFF, num & 0xFF];
        //}
        //function getUint16Bytes(num) {
        //    return [num >> 8 & 0xFF, num & 0xFF];
        //}
        //function getInt16Bytes(num) {
        //    return num >= 0 ? getUint16Bytes(num) : getUint16Bytes(65536 + num);
        //} 
    展开全文
  • 简述:我们知道1字节占8bit; 0000000 ~ 11111111以char形式表示就是 -128 ~ 127; 至于为什么回头再补充!!!以byte表示的话就是 0 ~ 255 等同于unsigned char因为C语言本身没有byte类型以十六进制表示的话就是 0x00 ~ 0...

    简述:

    我们知道1字节占8bit; 0000000 ~ 11111111

    以char形式表示就是 -128 ~ 127; 至于为什么回头再补充!!!

    以byte表示的话就是 0 ~ 255 等同于unsigned char因为C语言本身没有byte类型

    以十六进制表示的话就是 0x00 ~ 0xFF

    问题:

    有时候我们会有这样的需求, 给你一串字符, 但是要以16进制的方式使用, 这时候就需要将两字节放到一字节中. 16进制时1字节是使用两个数字表示的, 以字符串形式的话就是占两字节. 这时候就需要转换, 高级语言转换起来会更简单, 使用会更方便, 这里以C语言形式来转换, 通用性强会强一点

    16进制字符串, 即一串字符串(3132333435363738393a3b3c3d3e3f40)字符串形式的话占32字节, 但是如果他们是16进制表示的话(0x31, 0x32 ... 0x40), 那么就是占16字节, 那么怎么转换成占16字节大小的byte数组呢?

    思路: 首先第一组0x31, 转换成十进制就是49, 那么怎么转换呢, 一般会先转换成2进制再转换成10进制. 那用程序怎么表示呢? 我们可以考虑一下, 3以2进制表示(简写)0000 0011, 1以2进制表示0000 0001, 那么在内存中0x31怎么存放的呢? 我们知道十六进制一个数字能表示的范围时0~F, 所以要表示1字节的话就需要两个16进制数, 那么0x31的存放就是一字节的前4位表示3, 后四位表示1, 即0011 0001(十进制49), 那怎么才能把字符3转换成数字3, 并且再放到前四位, 用代码表示就是

    // 假如字符串 "31"; 拆开成字符就如下面

    // 注意这里我们是以数字举例的, 如果有ABCDEF, 还需要另外考虑

    char m = '3';

    char n = '1';

    unsigned char byte = 0; // 1字节 待会存放0x31使用, C语言中没有字节类型, 这里用unsigned char 代替, 一样的效果

    // 要先将字符 '3' 转换成数字 3; 字符 '1' 转换成数字 1

    // 最简单的就是 '3' - '0' 即 m = m - '0';

    // 更好的办法就是位运算(需要经验才会习惯, 大神飘过), 如下

    m = m & ~0x30; // 或者 m = m & ~'0'; m = m & ~48;

    // 字符 '1' 同理, 那么此时 m = 3, n = 1;接下来就是如何存放成1字节了

    // 将 3 向左移4位, 就是00000011变成00110000

    // 再加上1(00000001)就行了, 代码表示就是

    m = m << 4;

    byte = m | n;

    看一下结果:

    e51189748a43

    结果.png

    那么怎么封装一个函数来做这件事? 直接附上代码

    #include

    #include

    #include

    int hexstringtobyte(char *in, unsigned char *out);

    int hexstringtobyte(char *in, unsigned char *out) {

    int len = (int)strlen(in);

    char *str = (char *)malloc(len);

    memset(str, 0, len);

    memcpy(str, in, len);

    for (int i = 0; i < len; i+=2) {

    //小写转大写

    if(str[i] >= 'a' && str[i] <= 'f') str[i] = str[i] & ~0x20;

    if(str[i+1] >= 'a' && str[i] <= 'f') str[i+1] = str[i+1] & ~0x20;

    //处理第前4位

    if(str[i] >= 'A' && str[i] <= 'F')

    out[i/2] = (str[i]-'A'+10)<<4;

    else

    out[i/2] = (str[i] & ~0x30)<<4;

    //处理后4位, 并组合起来

    if(str[i+1] >= 'A' && str[i+1] <= 'F')

    out[i/2] |= (str[i+1]-'A'+10);

    else

    out[i/2] |= (str[i+1] & ~0x30);

    }

    free(str);

    return 0;

    }

    int bytetohexstring(unsigned char *in, int len, char *out);

    int bytetohexstring(unsigned char *in, int len, char *out) {

    for (int i = 0; i < len; i++) {

    if ((in[i] >> 4) >= 10 && (in[i] >> 4) <= 15)

    out[2*i] = (in[i] >> 4) + 'A' - 10;

    else

    out[2*i] = (in[i] >> 4) | 0x30;

    if ((in[i] & 0x0f) >= 10 && (in[i] & 0x0f) <= 15)

    out[2*i+1] = (in[i] & 0x0f) + 'A' - 10;

    else

    out[2*i+1] = (in[i] & 0x0f) | 0x30;

    }

    return 0;

    }

    使用如下:

    int main(int argc, const char * argv[]) {

    char *str = "fa32333435363738393a3b3c3d3e3f40";

    unsigned char temp[16] = {0};

    hexstringtobyte(str, temp);

    for (int i = 0; i < 16; i++) {

    printf("%d ", temp[i]);

    }

    printf("\n");

    char out[33] = {0}; // 多留了一位存放 '\0'

    bytetohexstring(temp, 16, out);

    printf("%s\n", out);

    return 0;

    }

    展开全文
  • Java字节数组转文件,文件转字节数组 package IO; import java.io.*; public class IOtest07 { public static void main(String[] args) { IOtest07 io=new IOtest07(); byte[] temp=io.fileToByteArray("src/...

    Java字节数组转文件,文件转字节数组

    package IO;
    
    import java.io.*;
    
    public class IOtest07 {
        public static void main(String[] args) {
            IOtest07 io=new IOtest07();
            byte[] temp=io.fileToByteArray("src/IO/src_path/abc.txt");
            io.byteArrayToFile(temp,"src/IO/dest_path/dest.txt");
        }
        public byte[] fileToByteArray(String src_path){
            File src=new File(src_path);
            byte[] dest=null;
            FileInputStream fis=null;
            ByteArrayOutputStream baos=new ByteArrayOutputStream();
            try {
                fis=new FileInputStream(src);
                byte[] temp=new byte[1024];
                int len=-1;
                while((len=fis.read(temp))!=-1){
                    baos.write(temp,0,len);
                }
                baos.flush();
                return baos.toByteArray();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
        public void byteArrayToFile(byte[] src,String dest_path){
            ByteArrayInputStream bais=new ByteArrayInputStream(src);
            File dest=new File(dest_path);
            FileOutputStream fos=null;
            try {
                fos=new FileOutputStream(dest);
                byte[] temp=new byte[1024];
                int len=-1;
                while((len=bais.read(temp))!=-1) {
                    fos.write(temp,0,len);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    
    展开全文
  • 直接上代码:public static void main(String[] args) {String str="23555555550b01010000D002002A";byte[] d =hexStringToBytes(str);...}/*** 16进制字符串byte[]* @param hexString the hex string* @return...

    直接上代码:

    public static void main(String[] args) {

    String str="23555555550b01010000D002002A";

    byte[] d =hexStringToBytes(str);

    printHexString(d);

    }

    /**

    * 16进制字符串转byte[]

    * @param hexString the hex string

    * @return byte[]

    */

    public static byte[] hexStringToBytes(String hexString) {

    if (hexString == null || hexString.equals("")) {

    return null;

    }

    hexString = hexString.toUpperCase();

    int length = hexString.length() / 2;

    char[] hexChars = hexString.toCharArray();

    byte[] d = new byte[length];

    for (int i = 0; i < length; i++) {

    int pos = i * 2;

    d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));

    }

    return d;

    }

    /**

    * 16进制字符byte

    * @param c char

    * @return byte

    */

    private static byte charToByte(char c) {

    return (byte) "0123456789ABCDEF".indexOf(c);

    }

    //将指定byte数组以16进制的形式打印到控制台

    public static void printHexString( byte[] b) {

    for (int i = 0; i < b.length; i++) {

    String hex = Integer.toHexString(b[i] & 0xFF);

    if (hex.length() == 1) {

    hex = '0' + hex;

    }

    System.out.print(hex.toUpperCase() );

    }

    }

    效果:

    63ddb9618cdd87e099d963298f2ab78d.png

    展开全文
  • package ...import java.io.BufferedOutputStream;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInpu...
  • C# 字符串转字节数组

    2021-06-06 23:07:52
    c# 字符串转字节数组
  • 用于结构体转字节流的设计方案1 struct Datas { enum { Data_null, Date_type, Data_guid, Data_name, Data_id, Type_end }; int getType() { return getTypeInt(datas[Date_type]); } void ...
  • 结构体转字节流方案改进,用于传输视频流 #pragma once #include <atlstr.h> #include <map> #define MaxReqLen 15 #define Cmd_rtsp 200 //"rtsp" #define Cmd_replay 201 //"replay" #define ...
  • 图片成流 Bitmap b = new Bitmap(Server.MapPath(ppath)); Stream ms = new MemoryStream(); b.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);...字节转图片 /// <summary> /// 字节
  • /*** 数字转字节数组工具类*/public class BitConverter {/*** 以字节数组的形式返回指定的布尔值* @param data 一个布尔值* @return 长度为 1 的字节数组*/public static byte[] getBytes(boole...
  • 例如在微信公众号中消息加密解密就绪要把消息的长度(一个无符号32位数)转换成字节类型,转换成字节后,排列方式有两种,一种是低字节在前高字节在后(比较常用的),第二种就是高字节在前,低字节在后。...
  • ,获取到的是ByteBuf类型的,就用到了BytBuf转字节流,代码如下: @Override protected void channelRead0(ChannelHandlerContext channelHandlerContext, DatagramPacket datagramPacket) throws Exception { //...
  • 最近做的一个小车,上位机给开发板发送浮点数据,需要将浮点的数据字节 这里需要使用python的struct.pack函数 speed = 0.1 a = struct.pack('<f',speed) //将浮点数据成四个字节,这里使用的是单片机的...
  • 文章目录int转字节数组字节数组转intlong转字节数组字节数组转long参考 int转字节数组 public static byte[] intTobyteArray(int num) { byte[] b = new byte[4]; b[3] = (byte)(num & 0xff); b[2] = (byte)...
  • python字节码(

    2021-02-03 22:23:20
    了解 Python 字节码是什么,Python 如何使用它来执行你的代码,以及知道它是如何帮到你的。如果你曾经编写过 Python,或者只是使用过 Python,你或许经常会看到 Python 源代码文件——它们的名字以.py结尾。你可能还...
  • 1KB=1024B,即K和字节之间的转换关系是1024倍。 在多数的计算机系统中,一个字节是一个8位长的数据单位,大多数的计算机用一个字节表示一个字符、数字或其他字符。一个字节也可以表示一系列二进制位。 一些处理器...
  • C语言字节序转换

    2021-12-14 18:21:10
    但当数据大于1字节时,就必须考虑如何存放了(先放高字节还是低字节),如十六进制数0x12345678,按人类阅读习惯,左起为高字节,右起为低字节;对比两种字节序可以发现无非就是:**高字节移动到低字节,低字节移动...
  • 你也可以只是马歇尔.复制位图数据。没有中间内存流等和一个快速的内存副本。这应该同时适用于24位和32位图。publicstaticbyte[]BitmapToByteArray(Bitmapbitmap){BitmapDatabmpdata=null;try{bmpdata=bitmap....
  • 掌握Java字节码()

    2021-02-12 22:31:45
    Java字节码就是你写的源代码的中间表现形式,也就是你的代码编译后的产物。你的class文件就是字节码。简单点说,字节码就是JVM使用的代码集,它在运行时可能会被JIT编译器编译成本地代码。你玩过汇编语言或者机器...
  • How do you turn a long unsigned int into a list of four bytes in hexidecimal?Example...777007543 = 0x2E 0x50 0x31 0xB7解决方案The simplest way I can think of is to use the struct module from within a ...
  • python字节转换

    2021-05-26 08:54:40
    1、二进制转换为字节 bin_str = '0b00000000' data_bytes = BitArray...2、字符串转字节 bytes_str = 'AA55' data_bytes = bytes_str.encode('utf-8') 3、十进制转字节 data_bytes = binascii.b2a_hex(np.uint8(12))
  • 我想这样做是因为我使用的是Amazon Kinesis,更具体地说是PutRecord API,PutRecordRequest要求数据是ByteBuffer,所以我需要将JSONObject转换为字节数组,然后将字节数组包装为ByteBuffer .然后,当我检索记录时,我需要...
  • 问题描述或许你会说一个中文字符占2个字节,这是一定的?如何计算一个字符串的字节数?解决方案在oracle中一个字符特别是中文占几个字节是不同的。比如我创立一个表create table test_ly(a varchar2(4),b nvarchar2(4...
  • 字节概念:字节(Byte )是计算机信息技术用于计量存储容量的一种计量单位,作为一个单位来处理的一个二进制数字串,是构成信息的一个小单位。最常用的字节是八位的字节,即它包含八位的二进制数。位:(bit):是计算机...
  • toByteArray(1729.1729 as Float) toByteArray(1729) toByteArray(-1729) 但是结果与您的期望相反(由于字节顺序): [234, 149, 178, 12, 177, 4, 155, 64] [136, 37, 216, 68] [193, 6, 0, 0, 0, 0, 0, 0] [63, ...
  • 字节转经纬度

    2020-12-29 02:36:54
    /初始化byte[] bLat = new byte[4];//调用string latStr = this.LngLatByte2Float(bLat).ToString(); //lat//实现public float LngLatByte2Float(byte[] b){if (b.Length != 4) return 0;int d = 0x00;...
  • 一个String,要zhi看有几个字母或者dao几个汉字,一个英文字母就是一个字节,一个汉字就是两个字节,以此类推计算。 带符号按位左移 << 带符号右移>> 不带符号右移 >>> 1.内存中的位运算,都会...
  • //count() 字节集长度 //整数到字节集 返回字节集 function Int2Bin($i){ return unpack("C*", pack("N", $i)); //"n"短整数二字节 "N"整数4字节 } //字节集到16进制文本 $arr数组 返回16进制文本型 function Bin...
  • // Returns the contents of the file in a byte array.public static byte[] getBytesFromFile(File file) throws IOException {InputStream is = new FileInputStream(file);byte[] bytes;try {// Get the size of...
  • 看到InputStreamReader和OutputStreamWriter的一些说法,说InputStreamReader是将字节流转换成字符流,而OutputStreamWriter则相反,是将字符流转换成字节流;但是BufferedWriter bw = new BufferedWriter(new ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,045,590
精华内容 418,236
关键字:

转字节