16进制显示字节流技巧分享_java

用UE的人都会觉得16进制显示文件灰常方便。为啥捏?当你要对文件加密、转码、编码的时候,蹦出一堆01二进制看着都会头大。毕竟十六进制显示文件简短方便。至少中考高考时涂过卡吧,1+2+4+8能算明白是几吧。当然,那些中考和高考都能把1248码都涂错的童鞋们,一看就知道它们果断与程序猿这个“神剩”的职业无缘哈……

因为之前试着参加过科普创新大赛,当时做的咚咚是把文件以字节流读入,并转化成二进制、四进制、十六进制字符串,然后刷的一下子输出到控制台。再根据每个位的值,分别以2色、4色、16色的矩阵显示。写这个的目的是为了用摄像头识别,然后再还原成字节流写到文件里。这个程序设计是两个蛋疼的事实杂交出的产物——1.要求不通过任何介质和USB设备传输文件;2.zxing和QRCode有时会找不到二维码(QRCode更容易出错)。大家可以试试这个题目,用摄像头或者扬声器发送接收文件,看谁传得快,题目确实蛮有意思的呢。

当然,最重要的部分是进制转化了,读入文件的字节流byte 8位,用两个16进制显示。因为可能会遇到byte转int后为补码的情况,所以最好先统一成正数,方法其实很简单啦,一个与运算就搞定!

复制代码 代码如下:

int result = bytes&0xff;

别小看这个语句,其实这个语句很有意思的。仔细想想,为神马加了个0xff就变成正数呢?0xff每个位都是1,那与运算不就等于没变化么?哼哼,之前还真有人这么问过我,如果真有这样的问题,那就是java基础不牢固了。byte的范围是-128~127,不是0~255,所以嘛,像byte b= -42;这样的赋值肯定不能用byte b= 214;来替代了。

弄出这个,转成N进制字符串就不是啥难事了。仔细想想,是不是有个熟悉而又陌生的类直接就带这个功能呢?没错,就是用Integer来实现!但是先别急,用它之前,还得对这个int搞点小动作。

复制代码 代码如下:

( bytes & 0xff ) + 0x100

知道这是为什么?这个就是+256啊,只是为了看得直观些,就是前面加上一位。因为你得到的int转成String的话很可能只有一个位,也就是byte转16进制时丢了一位,那整个程序岂不就全错位了?安全起见,还是先统一成三位吧。

你可以试试这个看看所有byte变16进制后的输出

复制代码 代码如下:

public static void main(String[] args) {
for (int i = -128; i < 128; i++) {
byte b=(byte)i;
System.out.println( Integer.toString( ( b & 0xff ), 16));
}
}

看到这里,你会不会想:你怎么这么笨呢?for循环里的int为什么不改成byte,不就省了一行代码了么,多大的便宜啊!可以呀,你试试呗,反正我是不会去试的……

所以,最后把byte转化成二位16进制的代码是

复制代码 代码如下:

Integer.toString( ( bytes & 0xff ) + 0x100, 16).substring( 1 );

对于2进制,4进制,8进制,都是一个道理,我就不举例了。一句代码就实现了,很神奇吧……

接下来就是用矩阵晶格一帧帧显示文件,用摄像头拍下识别颜色,再转换会字符串,并反馈个颜色让对方知道识别完了好换下一张图……如此循环,直到矩阵晶格显示文件已经结束。这部分代码我就不贴出来了,整个过程可以靠丰富的想象力YY出来吧……

然后是字符串转回字节流,这就是简单活了

复制代码 代码如下:

(byte)Integer.parseInt(string, 16)

连位运算都不用,直接就出结果,把它们放到字节数组里,用FileOutputStream的write反复的写就可以了!别忘了关闭输入输出流哈

时间: 2024-09-16 09:29:48

16进制显示字节流技巧分享_java的相关文章

javascript实现rgb颜色转换成16进制格式_javascript技巧

自己试过很好用 function zero_fill_hex(num, digits) { var s = num.toString(16); while (s.length < digits) s = "0" + s; return s; } function rgb2hex(rgb) { if (rgb.charAt(0) == '#') return rgb; var ds = rgb.split(/\D+/); var decimal = Number(ds[1]) *

php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串_php技巧

数据库脚本: -- -------------------------------------------------------- -- -- 表的结构 `highot_attachment` -- 复制代码 代码如下: CREATE TABLE IF NOT EXISTS `highot_attachment` ( `id` int(11) NOT NULL auto_increment, `phone_number_id` int(11) NOT NULL COMMENT 'phone_n

mfc-用MFC的编辑框怎么显示16进制

问题描述 用MFC的编辑框怎么显示16进制 从串口收的数据,想直接用16进制显示,怎么做?在MFC的编辑框里显示- 解决方案 // TODO: 在此处添加消息处理程序代码 //从串口接收数据并显示在编辑框中 VARIANT variant_inp; COleSafeArray safearray_inp; long len k; byte rxdata[512]; //设置BYTE数组 CString strtemp; unsigned short CRC16 = 0; short temp[4

php将字符串转换成16进制的方法_php技巧

本文实例讲述了php将字符串转换成16进制的方法.分享给大家供大家参考.具体分析如下: php中可以通过bin2hex函数将字符串转换成16进制的形式输出,bin2hex()函数返回结果为ascii码 <?php $string = "Hello\tworld!\n"; print($string."\n"); print(bin2hex($string)."\n"); ?> 输出结果如下: Hello world! 48656c6c

php将字符串转换成16进制的方法

 这篇文章主要介绍了php将字符串转换成16进制的方法,涉及php中bin2hex函数的使用技巧,非常具有实用价值,需要的朋友可以参考下     本文实例讲述了php将字符串转换成16进制的方法.分享给大家供大家参考.具体分析如下: php中可以通过bin2hex函数将字符串转换成16进制的形式输出,bin2hex()函数返回结果为ascii码 ? 1 2 3 4 5 <?php $string = "Hellotworld!n"; print($string."n&q

c++ .net-datagridview单元格的值如何以16进制表示?

问题描述 datagridview单元格的值如何以16进制表示? sendDataDlgGridView->Rows[0]->Cells[5]->Value = 0xFF; 0xFF为16进制,但显示在datagridview单元格的时候,就自动变成十进制了,有没有什么属性是可以16进制显示的? 如果没有的话,我能想到的就是把0xFF转成字符串再显示在单元格里.但我还有个接口要读取单元格的值,使用还得把字符串转成整形,比较麻烦. 解决方案 sendDataDlgGridView->

51单片机串口通信-51单片机中的串口通信发送10(16进制)以上显示不正确

问题描述 51单片机中的串口通信发送10(16进制)以上显示不正确 串口通信中,向单片机发送数据控制LED灯亮实验中 发01,02.04.08 依次是 第1 2 3 4 个灯亮 而发送 10 就成第5 6 个一起亮了,然后发20 .40 是第7 和 第 8 个: 发 80 就全灭了 , 这是啥情况啊. #include unsigned char a,flag; void init(); void main() { init(); while(1) { if(flag == 1) { ES =

socket接收并显示16进制的数据

问题描述 socket接收并显示16进制的数据 这是编写的客户端代码,接收服务器发送的16进制的数据,但是现实不出来. 解决方案 byte []data=new byte [1024]; int i=0; for(i=0;i<data.length;i++) textbox1.Text+=data[i].ToString("X2");//转成16进制字符串显示 解决方案二: 16进制数据,你需要转换为字符串等才能显示,它本身不一定是可见字符 解决方案三: 一个字节一个字节的读,然

16进制的正数为何显示为10进制数之后就为负数,如何使他总为正数,在线等!!大神,我很急!!

问题描述 16进制的正数为何显示为10进制数之后就为负数,如何使他总为正数,在线等!!大神,我很急!! 如下就是读取NFC标签数据的代码,并在调试窗口将读出的数据显示出来 我的问题是:NFC里面的数据本来就全是正数,但是读取出来后在电脑端显示却为负数,(我猜测是不是,在NFC里面的数全是16进制的,然后手机端读取出来后显示为10进制的数时,出现编码错误,从而导致变为负数了)那么如何将读取出的数据全部显示为正数,求大神赐教,在线等,急!! byte[] result = tagUtil.readA