274 lines
7.4 KiB
Java
274 lines
7.4 KiB
Java
package tctable;
|
||
|
||
import java.io.ByteArrayOutputStream;
|
||
import java.io.DataInputStream;
|
||
import java.io.IOException;
|
||
import java.io.InputStream;
|
||
import java.io.UnsupportedEncodingException;
|
||
import java.util.Calendar;
|
||
import java.util.TimeZone;
|
||
|
||
public class Tools {
|
||
|
||
public static String readStringFromInputStream(InputStream inputStream) {
|
||
ByteArrayOutputStream result = new ByteArrayOutputStream();
|
||
byte[] buffer = new byte[1024];
|
||
int length;
|
||
try {
|
||
while ((length = inputStream.read(buffer)) != -1) {
|
||
result.write(buffer, 0, length);
|
||
}
|
||
} catch (IOException e1) {
|
||
e1.printStackTrace();
|
||
}
|
||
// StandardCharsets.UTF_8.name() > JDK 7
|
||
try {
|
||
return result.toString("UTF-8");
|
||
} catch (UnsupportedEncodingException e) {
|
||
}
|
||
return "";
|
||
}
|
||
|
||
//Преобразовать арабские и индийские в современные цифры
|
||
public static String numConvert(String str)
|
||
{
|
||
if(str==null) return null;
|
||
String persian = "۰۱۲۳۴۵۶۷۸۹";
|
||
String arabic = "٩٨٧٦٥٤٣٢١٠";
|
||
String num = "0123456789";
|
||
//Заменяю персидские
|
||
for(int i=0;i<str.length();i++)
|
||
{
|
||
for(int j=0;j<persian.length();j++)
|
||
{
|
||
if(str.charAt(i)==persian.charAt(j))
|
||
{
|
||
str = str.substring(0,i) + num.charAt(j) + str.substring(i+1);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
//Заменяю арабские
|
||
for(int i=0;i<str.length();i++)
|
||
{
|
||
for(int j=0;j<arabic.length();j++)
|
||
{
|
||
if(str.charAt(i)==arabic.charAt(j))
|
||
{
|
||
str = str.substring(0,i) + num.charAt(j) + str.substring(i+1);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return str;
|
||
}
|
||
|
||
//Получить бит по его номеру нумерация лева на право
|
||
public static boolean getBit(byte[] mas, int pos)
|
||
{
|
||
int n=(int) Math.floor(pos/8.0);
|
||
int b=mas[n];
|
||
pos=pos - n * 8;
|
||
if(((b << pos) & 128) == 128)
|
||
return true;
|
||
else
|
||
return false;
|
||
}
|
||
|
||
//Установить 1й бит в номер нумерация с лева на право
|
||
public static void setBit(byte[] mas, int pos)
|
||
{
|
||
int n=(int) Math.floor(pos/8.0);
|
||
pos=pos - n * 8;
|
||
|
||
mas[n] = (byte)(mas[n] | (128 >> pos));
|
||
}
|
||
|
||
public static String readUTF8_1(InputStream handle) throws IOException
|
||
{
|
||
byte[] tmp=new byte[handle.read()];
|
||
handle.read(tmp);
|
||
return new String(tmp, "UTF8");
|
||
}
|
||
|
||
public static float readFloat(DataInputStream InStream) throws IOException
|
||
{
|
||
float f;
|
||
int ch1, ch2, ch3, ch4, count;
|
||
ch1 = InStream.readUnsignedByte();
|
||
ch2 = InStream.readUnsignedByte();
|
||
ch3 = InStream.readUnsignedByte();
|
||
ch4 = InStream.readUnsignedByte();
|
||
|
||
count = (ch4 << 24) | (ch3 << 16) | (ch2 << 8) | ch1;
|
||
f = Float.intBitsToFloat(count);
|
||
return f;
|
||
}
|
||
|
||
public static int readInt(DataInputStream InStream) throws IOException
|
||
{
|
||
int ch1, ch2, ch3, ch4, count;
|
||
ch1 = InStream.readUnsignedByte();
|
||
ch2 = InStream.readUnsignedByte();
|
||
ch3 = InStream.readUnsignedByte();
|
||
ch4 = InStream.readUnsignedByte();
|
||
|
||
count = (ch4 << 24) | (ch3 << 16) | (ch2 << 8) | ch1;
|
||
return count;
|
||
}
|
||
|
||
public static short readShort(DataInputStream InStream) throws IOException
|
||
{
|
||
int ch1, ch2, count;
|
||
ch1 = InStream.readUnsignedByte();
|
||
ch2 = InStream.readUnsignedByte();
|
||
|
||
count = (ch2 << 8) | ch1;
|
||
return (short)count;
|
||
}
|
||
|
||
public static int readUShort(InputStream InStream) throws IOException
|
||
{
|
||
int ch1, ch2;
|
||
ch1 = InStream.read();
|
||
ch2 = InStream.read();
|
||
return (ch2 << 8) | ch1;
|
||
}
|
||
|
||
public static String afterLast(String str, String ch)
|
||
{
|
||
int i=str.lastIndexOf(ch);
|
||
if(i!=-1)
|
||
{
|
||
return str.substring(i+ch.length());
|
||
}
|
||
return "";
|
||
}
|
||
public static String beforeLast(String str, String ch)
|
||
{
|
||
int i=str.lastIndexOf(ch);
|
||
if(i!=-1)
|
||
{
|
||
return str.substring(0,i);
|
||
}
|
||
return "";
|
||
}
|
||
public static String beforeFirst(String str, String ch)
|
||
{
|
||
int i=str.indexOf(ch);
|
||
if(i!=-1)
|
||
{
|
||
return str.substring(0,i);
|
||
}
|
||
return "";
|
||
}
|
||
|
||
//узнать точку пересичений 2х линай если x=0 и y=0 то не пересиклась
|
||
public static Point getCrossingLine(Point PHead0, Point PTail0, Point PHead1, Point PTail1)
|
||
{
|
||
Point rezPoint = new Point();
|
||
|
||
double a0, b0, c0, a1, b1, c1;
|
||
boolean bRez = true;
|
||
a0 = PTail0.y - PHead0.y;
|
||
b0 = PHead0.x - PTail0.x;
|
||
c0 = PTail0.x * PHead0.y - PHead0.x * PTail0.y;
|
||
|
||
a1 = PTail1.y - PHead1.y;
|
||
b1 = PHead1.x - PTail1.x;
|
||
c1 = PTail1.x * PHead1.y - PHead1.x * PTail1.y;
|
||
|
||
if (b1 == 0) rezPoint.x = PHead1.x;//если перпендикулярна oy
|
||
else rezPoint.x = (-(b0 * c1 / b1) + c0) / ((b0 * a1 / b1) - a0);
|
||
if (a1 == 0) rezPoint.y = PHead1.y;//если перпендикулярна oy
|
||
else rezPoint.y = (-(c1 * a0 / a1) + c0) / ((a0 * b1 / a1) - b0);
|
||
//проверка на вхождение в отрезоки (с погрешностью 0.0000001 (зачем понадобилась погрешность?))
|
||
//по x
|
||
if ((rezPoint.x < Math.min(PHead0.x, PTail0.x) - 0.0000001) || (rezPoint.x > Math.max(PHead0.x, PTail0.x) + 0.0000001))
|
||
bRez = false;
|
||
if ((rezPoint.x < Math.min(PHead1.x, PTail1.x) - 0.0000001) || (rezPoint.x > Math.max(PHead1.x, PTail1.x) + 0.0000001))
|
||
bRez = false;
|
||
//по y
|
||
if ((rezPoint.y < Math.min(PHead0.y, PTail0.y) - 0.0000001) || (rezPoint.y > Math.max(PHead0.y, PTail0.y) + 0.0000001))
|
||
bRez = false;
|
||
if ((rezPoint.y < Math.min(PHead1.y, PTail1.y) - 0.0000001) || (rezPoint.y > Math.max(PHead1.y, PTail1.y) + 0.0000001))
|
||
bRez = false;
|
||
|
||
if (!bRez)
|
||
{
|
||
rezPoint.x = 0;
|
||
rezPoint.y = 0;
|
||
}
|
||
return rezPoint;
|
||
}
|
||
|
||
public static Point getCrossingLine2(Point PHead0,Point PTail0,Point PHead1,Point PTail1)
|
||
{
|
||
boolean bRez=true;
|
||
Point rezPoint = new Point();
|
||
rezPoint.x=0;
|
||
rezPoint.y=0;
|
||
|
||
double a0,b0,c0,a1,b1,c1;
|
||
a0=PTail0.y-PHead0.y;
|
||
b0=PHead0.x-PTail0.x;
|
||
c0=PTail0.x*PHead0.y-PHead0.x*PTail0.y;
|
||
|
||
a1=PTail1.y-PHead1.y;
|
||
b1=PHead1.x-PTail1.x;
|
||
c1=PTail1.x*PHead1.y-PHead1.x*PTail1.y;
|
||
|
||
if (b1==0) rezPoint.x=PHead1.x;//если перпендикулярна oy
|
||
else rezPoint.x=(-(b0*c1/b1)+c0)/((b0*a1/b1)-a0);
|
||
if (a1==0) rezPoint.y=PHead1.y;//если перпендикулярна ox
|
||
else rezPoint.y=(-(c1*a0/a1)+c0)/((a0*b1/a1)-b0);
|
||
//по x
|
||
if (rezPoint.x<Math.min(PHead0.x,PTail0.x)||rezPoint.x>Math.max(PHead0.x,PTail0.x))
|
||
bRez=false;
|
||
if (rezPoint.x<Math.min(PHead1.x,PTail1.x)||rezPoint.x>Math.max(PHead1.x,PTail1.x))
|
||
bRez=false;
|
||
//по y
|
||
if (rezPoint.y<Math.min(PHead0.y,PTail0.y)||rezPoint.y>Math.max(PHead0.y,PTail0.y))
|
||
bRez=false;
|
||
if (rezPoint.y<Math.min(PHead1.y,PTail1.y)||rezPoint.y>Math.max(PHead1.y,PTail1.y))
|
||
bRez=false;
|
||
if (!bRez)
|
||
{
|
||
rezPoint.x=0;
|
||
rezPoint.y=0;
|
||
}
|
||
return rezPoint;
|
||
}
|
||
|
||
//Так как в replaceAll много заморочек с регулярными выражениями
|
||
public static String replaceAll(String txt, String val, String rep) {
|
||
if(txt==null || val==null || rep==null) return txt;
|
||
return txt.replace(val,rep);
|
||
/*while(true)
|
||
{
|
||
String tmpstr=txt.replace(val, rep);
|
||
if(tmpstr.equals(txt))
|
||
{
|
||
txt=tmpstr;
|
||
break;
|
||
}else
|
||
{
|
||
txt=tmpstr;
|
||
}
|
||
}
|
||
return txt;*/
|
||
}
|
||
|
||
public static byte[] subArray(byte[] b, int offset, int length) {
|
||
byte[] sub = new byte[length];
|
||
for (int i = offset; i < offset + length; i++) {
|
||
try {
|
||
sub[i - offset] = b[i];
|
||
} catch (Exception e) {
|
||
|
||
}
|
||
}
|
||
return sub;
|
||
}
|
||
}
|