在安装QT时,会提示没有安装C++/c编译器,(就是下面的这句英文)
You need a C++ compiler. Please install it using the System Package Management tools.
所以我们要手动安装一个C++/C编译器,否则就会出现出现不能新建桌面应用程序,所以在安装QT之前我们要
首先安装一个C++/C编译器,这个很简单,使用下面的命令就可以安装
sudo apt-get install build-essential
安装了该软件包,编译c/c++所需要的软件包也都会被安装。因此如果想在Ubuntu中编译c/c++程序,只需要安装该软件包就可以了。
然后在安装QT就行了,
1. 下载Qt_SDK_Lin32_offline_v1_1_4_en.run
2、chmod u+x Qt_SDK_Lin32_offline_v1_1_4_en.run
3、sudo ./Qt_SDK_Lin32_offline_v1_1_4_en.run
注意别搞错权限了就打不开了
这些命令要到Qt_SDK_Lin32_offline_v1_1_4_en.run所在路径下执行
再安装好后。老是出现Unable to locate theme engine in module_path: "pixmap"毛病
解决Unable to locate theme engine in module_path: "pixmap"
Gtk-WARNING **: Unable to locate theme engine in module_path: "pixmap"
纳闷老是弹这东东出来,虽然。。。貌似不影响什么,可是看着不爽
装下那个engines就好了,就那么一行。。。
sudo apt-get install gtk2-engines-pixbuf
(在ubuntu 11.10下没发现有gtk3的。。不过装了这一样再没提示了)
QShared
|---QGLayoutIterator
| |---QLayoutArrayIterator
| |---QBoxLayoutIterator
| |---QToolLayoutIterator
| |---QMainWindowLayoutIterator
|---QBrushData
|---QDOM_ImplementationPrivate
|---QDOM_NodePrivate
| |---QDOM_DocumentTypePrivate
| |---QDOM_DocumentFragmentPrivate
| |---QDOM_CharacterDataPrivate
| | |---QDOM_TextPrivate
| | | |---QDOM_CDATASectionPrivate
| | |---QDOM_CommentPrivate
| |---QDOM_AttrPrivate
| |---QDOM_ElementPrivate
| |---QDOM_NotationPrivate
| |---QDOM_EntityPrivate
| |---QDOM_EntityReferencePrivate
| |---QDOM_ProcessingInstructionPrivate
| |---QDOM_DocumentPrivate
|---QDOM_NodeListPrivate
|---QDOM_NamedNodeMapPrivate
|---QFontData
|---array_data
|---QGuardedPtrPrivate
|---QImageData
|---QMapPrivateBase
| |---QMapPrivate
|---QMemoryManagerFont
|---QSMCacheItem
|---QPalData
|---QPenData
|---QPixmapData
|---QRegionData
|---QTextCharFormat
|---QTextCustomItem
| |---QTextHorizontalLine
| |---QTextLineBreak
| |---QTextImage
| |---QTextTable
|---QSmartPtrPrivate
|---QStringData
|---QValueListPrivate
|---QVariantPrivate
|---QCursorData
|---QIconSetPrivate
|---WhatsThisItem
QLayoutItem
|---QSpacerItem
|---QWidgetItem
|---QLayout
|---QTextTableCell
QGArray
|---QArray
| |---QPointArray
QGCacheIterator
|---QAsciiCacheIterator
|---QCacheIterator
|---QIntCacheIterator
QGDictIterator
|---QAsciiDictIterator
| |---QSignalDictIt
|---QDictIterator
|---QIntDictIterator
| |---QWidgetIntDictIt
|---QPtrDictIterator
QAsyncIO
|---QDataSink
|---QDataSource
| |---QIODeviceSource
QTextDecoder
|---QBig5Decoder
|---QEucJpDecoder
|---QEucKrDecoder
|---QGbkDecoder
|---QJisDecoder
|---QSjisDecoder
|---QTextStatelessDecoder
|---QTextCodecFromIODDecoder
|---QUtf8Decoder
|---QUtf16Decoder
QTextCodec
|---QBig5Codec
|---QEucJpCodec
|---QEucKrCodec
|---QGbkCodec
|---QJisCodec
|---QKoi8Codec
|---QHebrewCodec
| |---QArabicCodec
|---QSjisCodec
|---QWindowsLocalCodec
|---QTextCodecFromIOD
|---QSimpleTextCodec
|---QLatin1Codec
|---QTsciiCodec
|---QUtf8Codec
|---QUtf16Codec
QByteArray
|---QBitArray
|---QCString
Qt
|---QBrush
|---QCanvasItem
| |---QCanvasSprite
| |---QCanvasPolygonalItem
| | |---QCanvasRectangle
| | |---QCanvasPolygon
| | |---QCanvasLine
| | |---QCanvasEllipse
| |---QCanvasText
|---QEvent
| |---QTimerEvent
| |---QMouseEvent
| |---QWheelEvent
| |---QKeyEvent
| |---QFocusEvent
| |---QPaintEvent
| |---QMoveEvent
| |---QResizeEvent
| |---QCloseEvent
| |---QShowEvent
| |---QHideEvent
| |---QIMEvent
| | |---QIMComposeEvent
| |---QDragResponseEvent
| |---QDragLeaveEvent
| |---QChildEvent
| |---QCustomEvent
| |---QDropEvent
| |---QDragMoveEvent
| | |---QDragEnterEvent
|---QGfx//抽象对屏幕具体操作接口
| |---QGfxRasterBase
| | |---QGfxRaster
| | | |---QGfxSNAP
| | | |---QGfxVFb
| | |---QDirectPainterGfx
|---QIconViewItem
|---QListViewItem
| |---File
| |---QCheckListItem
| |---Root
|---QCustomMenuItem
| |---QTearOffMenuItem
|---QObject
| |---QLayout
| | |---QGridLayout
| | |---QToolLayout
| | |---QMainWindowLayout
| | |---QBoxLayout
| | | |---QHBoxLayout
| | | |---QVBoxLayout
| |---QAccel
| |---QAction
| | |---QActionGroup
| |---QApplication
| |---QDataPump
| |---QCanvas
| |---QClipboard
| |---QColorDialogPrivate
| |---QCopChannel
| |---QDns
| | |---QDnsUgleHack
| |---QDnsSocket
| | |---QDnsManager
| |---QDragObject
| | |---QStoredDrag
| |---QDragManager
| |---QFileIconProvider
| | |---QWindowsIconProvider
| |---QGuardedPtrPrivate
| |---QWSKeyboardHandler
| | |---QWSyopyButtonsHandler
| | |---QWSVr41xxButtonsHandler
| | |---QWSVFbKeyboardHandler
| | |---QWSPC101KeyboardHandler
| | | |---QWSTtyKeyboardHandler
| | | |---QWSUsbKeyboardHandler
| |---QLibraryPrivate
| |---QNetworkProtocol
| | |---QFtp
| | |---QLocalFs
| |---QNetworkOperation
| |---QNPInstance
| |---QSenderObject
| |---QServerSocket
| | |---QVNCServer
| | |---QWSServerSocket
| | | |---QWSSoundServerSocket
| | | |---QWSServer
| |---QSessionManager
| |---QSignalMapper
| |---QSocket
| | |---QWSSocket
| | | |---QWSSoundClient
| | | |---QWSSoundServerClient
| |---QSocketNotifier
| |---QSound
| |---QAuServer
| |---QWSSoundServer
| |---QWSServer
| | |---QAuServerQWS
| |---QStyleSheet
| |---QToolTipGroup
| |---QTranslator
| |---QUrlOperator
| |---QWSInputMethod
| |---QWSClient
| |---QWSManager
| |---QWSServerSignalBridge
| |---QFrameEventHandler
| |---QMovieFilePrivate
| |---QWSSoundServerData
| |---QThreadPostEventPrivate
| |---QSingleShotTimer
| |---QTipManager
| |---QWhatsThisPrivate
| |---QWSMouseHandler
| | |---QAutoMouseHandler
| | |---QWSMouseHandlerPrivate
| | |---QYopyTPanelHandlerPrivate
| | |---QCustomTPanelHandlerPrivate
| | |---QVFbMouseHandlerPrivate
| | |---QWSMouseHandlerPrivate
| | |---QCalibratedMouseHandler
| | | |---QVrTPanelHandlerPrivate
| | | |---QTPanelHandlerPrivate
| | | |---QTSLibHandlerPrivate
| | | |---QPPTPanelHandlerPrivate
| |---QValidator
| | |---QDoubleValidator
| | |---QIntValidator
| | | |---QColIntValidator
| |---QTimer
| | |---QDnsQuery
| |---QStyle
| | |---QCommonStyle
| | | |---QWindowsStyle
| | | | |---QCompactStyle
| | | | |---QPlatinumStyle
| | | |---QMotifStyle
| | | | |---QCDEStyle
| | | | |---QInterlaceStyle
| | | | |---QMotifPlusStyle
| | | | |---QSGIStyle
| |---QWidget
| | |---QButton
| | | |---QCheckBox
| | | |---QPushButton
| | | |---QRadioButton
| | | |---QToolButton
| | | | |---QWhatsThisButton
| | |---QColorLuminancePicker
| | |---QColorShower
| | |---QComboBox
| | |---QDial
| | |---QDialog
| | | |---QColorDialog
| | | |---QFileDialog
| | | |---QFontDialog
| | | |---QInputDialog
| | | |---QMessageBox
| | | |---QPrintDialog
| | | |---QTabDialog
| | | |---QWizard
| | |---QFDProgressAnimation
| | |---QFrame
| | | |---QColorPicker
| | | |---QColorShowLabel
| | | |---QWidgetStack
| | | |---QGrid
| | | |---QGroupBox
| | | | |---QButtonGroup
| | | | | |---QHButtonGroup
| | | | | |---QVButtonGroup
| | | | |---QHGroupBox
| | | | |---QVGroupBox
| | | |---QHBox
| | | | |---QVBox
| | | |---QLabel
| | | | |---QWorkspaceChildTitleButton
| | | | |---QTipLabel
| | | |---QLCDNumber
| | | |---QMenuBar
| | | |---QSpinBox
| | | |---QPopupMenu
| | | | |---QComboBoxPopup
| | | |---QProgressBar
| | | |---QSplitter
| | | |---QWorkspaceChildTitleLabel
| | | |---QWorkspaceChild
| | | |---QToolBarSeparator
| | | |---QTableView
| | | | |---QWellArray
| | | | | |---QColorWell
| | | | |---QMultiLineEdit
| | | | | |---QIconViewItemLineEdit
| | | |---QScrollView
| | | |---QCanvasView
| | | |---QIconView
| | | |---QListBox
| | | | |---QFileListBox
| | | |---QListView
| | | | |---QFileListView
| | | |---QTable
| | | |---QTextView
| | | | |---QTextBrowser
| | |---QGLWidget
| | |---QHeader
| | | |---QTableHeader
| | |---QLineEdit
| | | |---QColNumLineEdit
| | | |---QRenameEdit
| | |---QMainWindow
| | |---QNPWidget
| | |---QScrollBar
| | |---QSemiModal
| | | |---QFDProgressDialog
| | | |---QProgressDialog
| | |---QSizeGrip
| | |---QSlider
| | |---QStatusBar
| | |---QTabBar
| | |---QTabWidget
| | |---QToolBar
| | |---QWorkspaceChildTitleBar
| | |---QWorkspace
| | |---QETWidget
| | |---QShapedPixmapWidget
| | |---QAccessWidget
| | |---QAlphaWidget
| | |---QHideDock
| | |---QClipperWidget
| | |---QSplitterHandle
| | |---QCornerSquare
| | |---QTextDetailPopup
| | |---QArrowWidget
| | |---QFocusDataAccessor
| | |---Invisible
|---QPainter
| |---QDirectPainter
|---QPen
|---QPixmap
|---QStyleSheetItem
|---QTableItem
|---QMutex
|---QThread
|---QWaitCondition
|---QSemaphore
|---QToolTip
| |---QIconViewToolTip
| |---QHideToolTip
|---QWhatsThis
|---QWSSoundServer
|---QWSCursor
|---QDialogPrivate
QIODevice
|---QBuffer
|---QFile
|---QSocket
|---QSocketDevice
|---QStringBuffer
QPolygonScanner
|---QCanvasPolygonScanner
|---QGfxRaster
QValueList
|---QCanvasItemList
|---TrieList
|---QStringList
|---QValueStack
QUnknownInterface
|---QLibraryInterface
QDataStream
|---QCopEnvelope
QRangeControl
|---QDial
|---QScrollBar
|---QSlider
|---QSpinBox
QXmlDefaultHandler
|---QDomHandler
QDomNode
|---QDomDocumentType
|---QDomDocument
|---QDomDocumentFragment
|---QDomCharacterData
| |---QDomText
| | |---QDomCDATASection
| |---QDomComment
|---QDomAttr
|---QDomElement
|---QDomNotation
|---QDomEntity
|---QDomEntityReference
|---QDomProcessingInstruction
QMimeSource
|---QDragObject
| |---QStoredDrag
| | |---QUriDrag
| | |---QColorDrag
| |---QTextDrag
| |---QImageDrag
| |---QIconDrag
QEvent,QMimeSource(双继承)
|---QDropEvent
| |---QDragMoveEvent
| | |---QDragEnterEvent
QListBoxItem
|---MCItem
|---QListBoxText
|---QListBoxPixmap
QFontFactory
|---QFontFactoryBDF
|---QFontFactoryFT
QDiskFontPrivate
|---QDiskFontFT
QRenderedFont
|---QRenderedFontFT
|---QRenderedFontBDF
QCollection
|---QGCache
| |---QIntCache
| |---QAsciiCache
| |---QCache
| | |---QFontCache
| | |---QPMCache
|---QGDict
| |---QDict
| |---QCDict
| |---QPtrDict
| |---QIntDict
| | |---QWidgetIntDict
| | | |---QWidgetMapper
| |---QAsciiDict
| |---QObjectDictionary
| |---QSignalDict
| |---QMemberDict
|---QGList
| |---QList
| | |---UrlInfoList
| | |---QGDItList
| | |---QObjectList
| | |---QConnectionList
| | |---QSortedList
| | |---QWidgetList
| | |---QButtonList
|---QGVector
| |---QVector
QBaseBucket
|---QStringBucket
|---QAsciiBucket
|---QIntBucket
|---QPtrBucket
QScreen//显示设备基类,包含显示设备基本描述和操作方式
|---QLinuxFbScreen
|---QSNAPScreen
|---QVFbScreen
QImageFormat
|---QGIFFormat
|---QMNGFormat
|---QPNGFormat
QImageFormatType
|---QGIFFormatType
|---QMNGFormatType
|---QPNGFormatType
QGL
|---QGLFormat
|---QGLContext
|---QGLWidget
QJpUnicodeConv
|---QJpUnicodeConv_Unicode_JISX0201
|---QJpUnicodeConv_Unicode_ASCII
|---QJpUnicodeConv_JISX0221_JISX0201
|---QJpUnicodeConv_JISX0221_ASCII
|---QJpUnicodeConv_Sun
|---QJpUnicodeConv_Microsoft
QGListIterator
|---QListIterator
| |---QObjectListIt
| |---QConnectionListIt
| |---QCListIt
| |---QWidgetListIt
QMapNodeBase
|---QMapNode
QMenuData
|---QMenuBar
|---QPopupMenu
QNetworkProtocolFactoryBase
|---QNetworkProtocolFactory
QPaintDevice
|---QPicture
|---QPixmap
| |---QBitmap
| |---QCanvasPixmap
| |---QwsPixmap
|---QPrinter
|---QPSPrinter
|---QWidget
QPNGImageWriter
|---QPNGImagePacker
QTextParagraph
|---QRichText
QStrListBase
|---QStrList
| |---QStrIList
QStrVec
|---QStrVec
| |---QStrIVec
QTextEncoder
|---QTextStatelessEncoder
|---QUtf16Encoder
QTextStream
|---QTextIStream
|---QTextOStream
QMutexPrivate
|---QRMutexPrivate
QUrl
|---QUrlOperator
QWSCommand
|---QWSIdentifyCommand
|---QWSCreateCommand
|---QWSRegionNameCommand
|---QWSRegionCommand
|---QWSRegionMoveCommand
|---QWSRegionDestroyCommand
|---QWSChangeAltitudeCommand
|---QWSRequestFocusCommand
|---QWSAddPropertyCommand
|---QWSSetPropertyCommand
|---QWSRemovePropertyCommand
|---QWSGetPropertyCommand
|---QWSSetSelectionOwnerCommand
|---QWSConvertSelectionCommand
|---QWSDefineCursorCommand
|---QWSSelectCursorCommand
|---QWSGrabMouseCommand
|---QWSGrabKeyboardCommand
|---QWSPlaySoundCommand
|---QWSQCopRegisterChannelCommand
|---QWSQCopSendCommand
|---QWSSetIMInfoCommand
|---QWSIMMouseCommand
|---QWSResetIMCommand
|---QWSSetIMFontCommand
QWSDecoration
|---QWSDefaultDecoration
| |---QWSHydroDecoration
| |---QWSKDE2Decoration
| |---QWSKDEDecoration
| |---QWSWindowsDecoration
| |---QWSBeOSDecoration
QAutoMouseSubHandler
|---QAutoMouseSubHandler_intellimouse
|---QAutoMouseSubHandler_serial
| |---QAutoMouseSubHandler_mousesystems
| |---QAutoMouseSubHandler_ms
|---QAutoMouseSubHandler_intellimouse
QXmlReader
|---QXmlSimpleReader
QEffects
|---QAlphaWidget
|---QRollEffect
QString
|---QCIString
QFont
|---QFont_Private
QScreenCursor
|---QVFbScreenCursor
QImageConsumer
|---QImageIOFrameGrabber
QMultiLineEditCommand
|---QBeginCommand
|---QEndCommand
|---QDelTextCmd
| |---QInsTextCmd
QPSPrinterFontPrivate
|---QPSPrinterFontTTF
|---QPSPrinterFontPFA
|---QPSPrinterFontPFB
|---QPSPrinterFontNotFound
|---QPSPrinterFontAsian
| |---QPSPrinterFontJapanese
| |---QPSPrinterFontKorean
| |---QPSPrinterFontTraditionalChinese
| |---QPSPrinterFontSimplifiedChinese
QWSSoundServerProvider
|---QWSSoundServerBucket
|---QWSSoundServerStream
转载:http://blog.163.com/sxs_solo/blog/static/263333820086410169909/
MD5即Message-Digest Algorithm 5(信息-摘要
算法 5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译
摘要算法、哈希算法),主流编程语言普遍已有MD5实现。
将数据(如汉字)运算为另一固定长度值是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
本实例介绍用MD5进行加密和验证,将输入字符串通过MD5加密成另一个字符串,而且根据新的字符串无法获得原字符串,但可以在不知道原始密码的情况下进行密码验证。
关键技术:
*通过java.security.MessageDigest的静态方法getInstance创建具有指定算法名称的信息摘要,参数为算法名,传入“MD5”则表示将使用MD5算法。
*MessageDigest的digest实例方法使用指定的字节数组对摘要进行最后更新,然后完成摘要计算,返回存放哈希值结果的季节数组,这个数组就是MD5加密产品。
*将加密后的字节数组转换成十六进制的字符窜,形成最终的密码。
*当输入字符串经过MD5加密后,得到的字符串与密码一样,则认为密码验证通过。
实例演示:
1import java.security.MessageDigest;
2
3
4public class Password {
5 //16进制下数字到字符的映射数组
6 private static String[] hexDigits = new String[]{"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};
7
8 //将inputstr加密
9 public static String createPassword(String inputstr)
10 {
11 return encodeByMD5(inputstr);
12 }
13
14 //验证密码是否正确
15 public static boolean authenticatePassword(String pass , String inputstr)
16 {
17 if(pass.equals((encodeByMD5(inputstr))))
18 {
19 return true;
20 }
21 else
22 {
23 return false;
24 }
25 }
26 //对字符串进行MD5编码
27 private static String encodeByMD5(String originstr)
28 {
29 if(originstr !=null)
30 {
31 try{
32 //创建具有指定算法名称的信息摘要
33 MessageDigest md = MessageDigest.getInstance("MD5");
34 //使用指定的字节数组对摘要进行最后的更新,然后完成摘要计算
35 byte[] results = md.digest(originstr.getBytes());
36 //将得到的字节数组编程字符窜返回
37 String resultString = byteArrayToHexString(results);
38 return resultString.toUpperCase();
39 }catch(Exception ex){
40 ex.printStackTrace();
41 }
42 }
43 return null;
44 }
45 //转换字节数组为十六进制字符串
46 private static String byteArrayToHexString(byte[] b)
47 {
48 StringBuffer resultsb = new StringBuffer();
49 int i=0;
50 for(i=0;i<b.length;i++)
51 {
52 resultsb.append(byteToHexString(b[i]));
53 }
54 return resultsb.toString();
55 }
56 //将字节转化成十六进制的字符串
57 private static String byteToHexString(byte b)
58 {
59
60 int n=b;
61 if(n<0)
62 {
63 n = 256 + n;
64 }
65 int d1 = n / 16;
66 int d2 = n /16;
67 return hexDigits[d1]+hexDigits[d2];
68 }
69
70 public static void main(String[] args)
71 {
72 String password = Password.createPassword("123456");
73 System.out.println("对123456用MD5加密后:"+password);
74 String inputstr = "1234";
75 System.out.println("1234与密码相同?"+Password.authenticatePassword(password, inputstr));
76 inputstr = "123456";
77 System.out.println("123456与密码相同?"+Password.authenticatePassword(password, inputstr));
78 }
79}
转自:http://blog.csdn.net/jay314159/article/details/4918358
Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示(23 + 22 + 21 + 20 = 15),所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和低4位分别转换成相应的16进制字符H和L,并组合起来得到byte转换到16进制字符串的结果new String(H) + new String(L)。即byte用十六进制表示只占2位。
同理,相反的转换也是将两个16进制字符转换成一个byte,原理同上。
根据以上原理,我们就可以将byte[] 数组转换为16进制字符串了,当然也可以将16进制字符串转换为byte[]数组了。
/**
Java代码
1. * Convert byte[] to hex string.这里我们可以将byte转换成int,然后利用Integer.toHexString(int)来转换成16进制字符串。
2. * @param src byte[] data
3. * @return hex string
4. */
5.public static String bytesToHexString(byte[] src){
6. StringBuilder stringBuilder = new StringBuilder("");
7. if (src == null || src.length <= 0) {
8. return null;
9. }
10. for (int i = 0; i < src.length; i++) {
11. int v = src[i] & 0xFF;
12. String hv = Integer.toHexString(v);
13. if (hv.length() < 2) {
14. stringBuilder.append(0);
15. }
16. stringBuilder.append(hv);
17. }
18. return stringBuilder.toString();
19.}
20./**
21. * Convert hex string to byte[]
22. * @param hexString the hex string
23. * @return byte[]
24. */
25.public static byte[] hexStringToBytes(String hexString) {
26. if (hexString == null || hexString.equals("")) {
27. return null;
28. }
29. hexString = hexString.toUpperCase();
30. int length = hexString.length() / 2;
31. char[] hexChars = hexString.toCharArray();
32. byte[] d = new byte[length];
33. for (int i = 0; i < length; i++) {
34. int pos = i * 2;
35. d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
36. }
37. return d;
38.}
39./**
40. * Convert char to byte
41. * @param c char
42. * @return byte
43. */
44. private byte charToByte(char c) {
45. return (byte) "0123456789ABCDEF".indexOf(c);
46.}
* Convert byte[] to hex string.这里我们可以将byte转换成int,然后利用Integer.toHexString(int)来转换成16进制字符串。
* @param src byte[] data
* @return hex string
*/
public static String bytesToHexString(byte[] src){
StringBuilder stringBuilder = new StringBuilder("");
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}
/**
* Convert hex string to 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;
}
/**
* Convert char to byte
* @param c char
* @return byte
*/
private byte charToByte(char c) {
return (byte) "0123456789ABCDEF".indexOf(c);
}
Java代码
1.//将指定byte数组以16进制的形式打印到控制台
2.public static void printHexString( byte[] b) {
3. for (int i = 0; i < b.length; i++) {
4. String hex = Integer.toHexString(b[i] & 0xFF); //b[i] 和0xFF进行与运算(0xFF默认是int型,二进制位00000000 00000000 00000000 11111111)
5. if (hex.length() == 1) {
6. hex = '0' + hex; //高四位置为0
7. }
8. System.out.print(hex.toUpperCase() ); //将十六进制个字符转换为大写输出到控制台
9. }
10.
11.}
//将指定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() );
}
}
java中byte转换int时为何与0xff进行与运算
在剖析该问题前请看如下代码
Java代码
1.public static String bytes2HexString(byte[] b) {
2. String ret = "";
3. for (int i = 0; i < b.length; i++) {
4. String hex = Integer.toHexString(b[ i ] & 0xFF);
5. if (hex.length() == 1) {
6. hex = '0' + hex;
7. }
8. ret += hex.toUpperCase();
9. }
10. return ret;
11.}
上面是将byte[]转化十六进制的字符串,注意这里b[ i ] & 0xFF将一个byte和 0xFF进行了与运算,然后使用Integer.toHexString取得了十六进制字符串,可以看出
b[ i ] & 0xFF运算后得出的仍然是个int,那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b[ i ]);,将byte强转为int不行吗?答案是不行的.
其原因在于:
1.byte的大小为8bits而int的大小为32bits
2.java的二进制采用的是补码形式
在这里先温习下计算机基础理论
byte是一个字节保存的,有8个位,即8个0、1。
8位的第一个位是符号位,
也就是说0000 0001代表的是数字1
1000 0000代表的就是-1
所以正数最大位0111 1111,也就是数字127
负数最大为1111 1111,也就是数字-128
上面说的是二进制原码,但是在java中采用的是补码的形式,下面介绍下什么是补码
1、反码:
一个数如果是正,则它的反码与原码相同;
一个数如果是负,则符号位为1,其余各位是对原码取反;
2、补码:利用溢出,我们可以将减法变成加法
对于十进制数,从9得到5可用减法:
9-4=5 因为4+6=10,我们可以将6作为4的补数
改写为加法:
9+6=15(去掉高位1,也就是减10)得到5.
对于十六进制数,从c到5可用减法:
c-7=5 因为7+9=16 将9作为7的补数
改写为加法:
c+9=15(去掉高位1,也就是减16)得到5.
在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为(100000000),进位1被丢弃。
⑴一个数为正,则它的原码、反码、补码相同
⑵一个数为负,刚符号位为1,其余各位是对原码取反,然后整个数加1
- 1的原码为 10000001
- 1的反码为 11111110
+ 1
- 1的补码为 11111111
0的原码为 00000000
0的反码为 11111111(正零和负零的反码相同)
+1
0的补码为 100000000(舍掉打头的1,正零和负零的补码相同)
Integer.toHexString的参数是int,如果不进行&0xff,那么当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行补位,
例如补码11111111的十进制数为-1转换为int时变为11111111111111111111111111111111好多1啊,呵呵!即0xffffffff但是这个数是不对的,这种补位就会造成误差。
和0xff相与后,高24比特就会被清0了,结果就对了。
----
Java中的一个byte,其范围是-128~127的,而Integer.toHexString的参数本来是int,如果不进行&0xff,那么当一个byte会转换成int时,对于负数,会做位扩展,举例来说,一个byte的-1(即0xff),会被转换成int的-1(即0xffffffff),那么转化出的结果就不是我们想要的了。
而0xff默认是整形,所以,一个byte跟0xff相与会先将那个byte转化成整形运算,这样,结果中的高的24个比特就总会被清0,于是结果总是我们想要的。
转自:http://franksinger.iteye.com/blog/614540