èæ¯
计ç®æºç§çåºèº«å¤§å¤å¦è¿ç¦»æ£æ°å¦ï¼æè ç工类ä¸ä¸ä¹å¤§å¤å¦ä¹ è¿ C æ C++ è¯è¨ï¼ä»ä¸æ们äºè§£å°åºæ¬ç±»åçæ´å½¢æ shortãintãlong çï¼è¿åå«ææ 符å·ï¼unsignedï¼å带符å·ï¼signedï¼çï¼ä½æ¯ä¸æ¯ææè¯è¨é½æ¯ææ 符å·ãJava å°±æ¯è¿æ ·ä¸é¨è¯è¨ã
ä½æ¯ï¼å¨å·¥ç¨å®è·µä¸ï¼æ们é¾å ä¼æä¸äºåºåä¼ç¨å°æ 符å·æ´åãä¾å¦ï¼å å¯ç®æ³çä¼å¸¸è¿è¡å¤è½®ä½è¿ç®ï¼è¿ä¸ªæ¶åä½è¿ç®é½è¦æ±æ¯æ 符å·çã
æ¬ææ¥ä»ç»ä¸ä¸ç¬è å¨è¿åçä¸äºç»éªï¼å段æ¶é´å¯¹ä¸ä¸ª C 代ç ç¿»è¯æäº Java 代ç ï¼å¨æ¤è¿ç¨ä¸ï¼æä¸ç¹ç»éªæ»ç»ï¼è®°å½äºæ¤ã大家ææ´å¥½çæ¹æ³ï¼æ¬¢è¿çè¨äº¤æµãç¬è åç»åç°æ°çç®æ´çæ¹å¼ï¼ä¹ä¼æ´æ°æ¬æã
Java æ°çæ¬ä¸ä¼å¼å ¥æ 符å·ï¼è¿ä¸ªä¸æ¯ææ 符å·ç设计ï¼æ¬èº«æ¯ä¸ªé常ä¸ææºçå³å®ã
ä½¿ç¨ unsigned
æ 符å·å³ç§»
ç®å对äºæ 符å·çæ¯æï¼Java åªå¨ä½è¿ç®çå³ç§»æ¯æäºä¸ä¸ªç¹æ®çç¬¦å· Â»>ï¼æ¯æå³ç§»å¿½ç¥ç¬¦å·ä½ï¼ç¨ 0 å¡«å ãä½æ¯è¿ä¸ªå¨å®è·µä¸è¯å®æ¯è¿è¿ä¸å¤çï¼å¾å¤åºæ¯æ æ³æ»¡è¶³ã
ç±»åå级åç¸æ¯æ
ç®åæ³è¦è·å¾æ 符å·çææï¼å½åçæ¹æ³åªè½è¿è¡ç±»åçå级ï¼å°±æ¯ byte å short 转æ¢ä¸º intï¼int 转æ¢ä¸º longï¼éè¿ä¸è¿ç®æ¥åªä¿çä¸åæ¬ç±»åä½æ°ä¸è´ãå 为æ¬èº« Java 对å个类åçé¿åº¦æ¯åäºå®ä¹çï¼æ以跨平å°ä½¿ç¨ä¸ä¼æé®é¢ã
// unsigned 注éï¼java ä¸æ²¡æ unsignedï¼æ以为äºå®ç° unsignedï¼éè¦ä½¿ç¨æ¯åæ¬ç±»åæ´å¤§çç±»åï¼éè¿ä½è¿ç®è·åå
¶ unsigned çå¼
// unsigned byte & short -> intï¼unsigned int -> long
private static int getUnsignedByte(byte b) {
return b & 0x0FF;
}
private static int getUnsignedShort(short data) {
return data & 0x0FFFF;
}
private static long getUnsignedInt(int data) {
// data & 0xFFFFFFFF å data & 0xFFFFFFFFL ç»ææ¯ä¸åçï¼éè¦æ³¨æï¼æå¯è½ä¸ JDK çæ¬æå
³
return data & 0xFFFFFFFFL;
}
bytes ç±»å转æ¢
ä¸è¬æ¥è¯´ï¼æ 符å·çä½è¿ç®ç»æåï¼ä¼å° bytes 转æ¢ä¸º String æè æ°åç±»åï¼Java 对è¿ç±»è½¬æ¢çæ¯æè¿æ¯æ¯è¾å¥½çï¼æ ååºé½æç¸åºç API æ¯æã
int/long ä¸ bytes çäºç¸è½¬æ¢
ç±»åé´ç转æ¢ä¹å±äºå¾å¸¸è§çæä½ï¼C++ ä¸ç»å¸¸ä½¿ç¨è¿æ ·çæå·§æ¥å° 4 个 char çæ°ç»å为ä¸ä¸ª intã
Java 对è¿åçæ¯æï¼è¿ç®æ¯è¾å好ï¼nio ä¸æ ByteBufferãéè¦æ³¨æçæ¯ï¼å¤§ç«¯ï¼Big-endianï¼åå°ç«¯ï¼Little-endianï¼çéæ©ï¼è¿ä¸ªæ¯ä¸ç³»ç»å¼ºç¸å ³çï¼ä¸è¬å¤§é¨åç³»ç»é½ä¸ºå°ç«¯ã
shortãint å long çç±»åç¨ç±»ä¼¼ç API å³å¯ä»¥å®æä¸ bytes çäºç¸è½¬æ¢ï¼éè¦æ³¨æä¸ç§ç±»åçåèæ°å¨å个系ç»ä¸æ¯åºå®çï¼æ¯ Java è¯è¨è§èå®ä¹çã
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
ByteOrder order = ByteOrder.LITTLE_ENDIAN;
// long
long l = 2147483648L;
byte[] bytes = ByteBuffer.allocate(8).order(order).putLong(l).array();
long data = ByteBuffer.wrap(bytes, 0, bytes.length).order(order).getLong();
// int
int i = 123456;
byte[] bytes = ByteBuffer.allocate(4).order(order).putInt(i).array();
int data = ByteBuffer.wrap(bytes, 0, bytes.length).order(order).getInt();
// short
short s = 32767;
byte[] bytes = ByteBuffer.allocate(2).order(order).putShort(s).array();
int data = ByteBuffer.wrap(bytes, 0, bytes.length).order(order).getShort();
String ä¸ bytes çäºç¸è½¬æ¢
String æä¸ä¸ªæ¹æ³å« getBytesï¼å¯ä»¥è·å bytes æ°ç»ãä½æ¯éè¦æ³¨æçæ¯ Java å é¨çå符ç¼ç æ¯ UTF16 çï¼èé UTF8ã
è¿æä¸ç¹éè¦æ³¨æçæ¯ï¼getBytes æ¯å¯ä»¥ä¼ å ¥å符ç¼ç çï¼è¿ä¸ªæ好æç¡®æå®ï¼å¦åä¼ç¨ç³»ç»é»è®¤çï¼è¿ä¸ªå¯è½ä¼å¨ä¸åç¯å¢ä¸è¡ä¸ºä¸ä¸è´ï¼å¯¼è´è¯¡å¼çé误ï¼è¾é¾å®ä½è§£å³ã
bytes 转æ¢ä¸º String ä¹å¾ç®åï¼String çæé å½æ°ç´æ¥æ¯æçã
import java.nio.charset.Charset;
Charset charset = Charset.forName("UTF-8");
String data = "abc";
byte[] bytes = data.getBytes(charset);
String newData = new String(bytes, 0, bytes.length, charset);