package com.frostwire.mp3;
public class BufferTools {
public static String byteBufferToString(byte[] bytes, int offset, int length) {
if (length < 1) return "";
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < length; i++) {
char ch;
if (bytes[offset + i] >= 0) ch = (char)bytes[offset + i];
else ch = (char)(bytes[offset + i] + 256);
stringBuffer.append(ch);
}
return stringBuffer.toString();
}
public static byte[] stringToByteBuffer(String s, int offset, int length) {
String stringToCopy = s.substring(offset, offset + length);
byte[] bytes = stringToCopy.getBytes();
return bytes;
}
public static void stringIntoByteBuffer(String s, int offset, int length, byte[] bytes, int destOffset) {
for (int i = 0; i < length; i++) {
char ch = s.charAt(offset + i);
byte by;
if (ch < 128) by = (byte)ch;
else by = (byte)(ch - 256);
bytes[destOffset + i] = by;
}
}
public static String trimStringRight(String s) {
int endPosition = s.length() - 1;
char endChar;
while (endPosition >= 0) {
endChar = s.charAt(endPosition);
if (endChar > 32) {
break;
}
endPosition--;
}
if (endPosition == s.length() - 1) return s;
else if (endPosition < 0) return "";
return s.substring(0, endPosition + 1);
}
public static String padStringRight(String s, int length, char padWith) {
if (s.length() >= length) return s;
StringBuffer stringBuffer = new StringBuffer(s);
while (stringBuffer.length() < length) {
stringBuffer.append(padWith);
}
return stringBuffer.toString();
}
public static boolean checkBit(byte b, int bitPosition) {
return ((b & (0x01 << bitPosition)) != 0);
}
public static byte setBit(byte b, int bitPosition, boolean value) {
byte newByte;
if (value) {
newByte = (byte) (b | ((byte)0x01 << bitPosition));
} else {
newByte = (byte) (b & (~ ((byte)0x01 << bitPosition)));
}
return newByte;
}
public static int shiftByte(byte c, int places) {
int i = c & 0xFF;
if (places < 0) {
return i << -places;
} else if (places > 0) {
return i >> places;
}
return i;
}
public static int unpackInteger(byte b1, byte b2, byte b3, byte b4) {
int value = b4 & 0xFF;
value += BufferTools.shiftByte(b3, -8);
value += BufferTools.shiftByte(b2, -16);
value += BufferTools.shiftByte(b1, -24);
return value;
}
public static byte[] packInteger(int i) {
byte[] bytes = new byte[4];
bytes[3] = (byte) (i & 0xFF);
bytes[2] = (byte) ((i >> 8) & 0xFF);
bytes[1] = (byte) ((i >> 16) & 0xFF);
bytes[0] = (byte) ((i >> 24) & 0xFF);
return bytes;
}
public static int unpackSynchsafeInteger(byte b1, byte b2, byte b3, byte b4) {
int value = ((byte)(b4 & 0x7F));
value += shiftByte((byte)(b3 & 0x7F), -7);
value += shiftByte((byte)(b2 & 0x7F), -14);
value += shiftByte((byte)(b1 & 0x7F), -21);
return value;
}
public static byte[] packSynchsafeInteger(int i) {
byte[] bytes = new byte[4];
packSynchsafeInteger(i, bytes, 0);
return bytes;
}
public static void packSynchsafeInteger(int i, byte[] bytes, int offset) {
bytes[offset + 3] = (byte) (i & 0x7F);
bytes[offset + 2] = (byte) ((i >> 7) & 0x7F);
bytes[offset + 1] = (byte) ((i >> 14) & 0x7F);
bytes[offset + 0] = (byte) ((i >> 21) & 0x7F);
}
public static byte[] copyBuffer(byte[] bytes, int offset, int length) {
byte[] copy = new byte[length];
for (int i = 0; i < length; i++) {
copy[i] = bytes[offset + i];
}
return copy;
}
public static void copyIntoByteBuffer(byte[] bytes, int offset, int length, byte[] destBuffer, int destOffset) {
for (int i = offset; i < length; i++) {
destBuffer[destOffset + i] = bytes[i];
}
}
public static int sizeUnsynchronisationWouldAdd(byte[] bytes) {
int count = 0;
for (int i = 0; i < bytes.length - 1; i++) {
if (bytes[i] == -0x01 && ((bytes[i + 1] & -0x20) == -0x20 || bytes[i + 1] == 0)) {
count++;
}
}
if (bytes.length > 0 && bytes[bytes.length - 1] == -0x01) count++;
return count;
}
public static byte[] unsynchroniseBuffer(byte[] bytes) {
int count = sizeUnsynchronisationWouldAdd(bytes);
if (count == 0) return bytes;
byte[] newBuffer = new byte[bytes.length + count];
int j = 0;
for (int i = 0; i < bytes.length - 1; i++) {
newBuffer[j++] = bytes[i];
if (bytes[i] == -0x01 && ((bytes[i + 1] & -0x20) == -0x20 || bytes[i + 1] == 0)) {
newBuffer[j++] = 0;
}
}
newBuffer[j++] = bytes[bytes.length - 1];
if (bytes[bytes.length - 1] == -0x01) {
newBuffer[j++] = 0;
}
return newBuffer;
}
public static int sizeSynchronisationWouldSubtract(byte[] bytes) {
int count = 0;
for (int i = 0; i < bytes.length - 2; i++) {
if (bytes[i] == -0x01 && bytes[i + 1] == 0 && ((bytes[i + 2] & -0x20) == -0x20 || bytes[i + 2] == 0)) {
count++;
}
}
if (bytes.length > 1 && bytes[bytes.length - 2] == -0x01 && bytes[bytes.length - 1] == 0) count++;
return count;
}
public static byte[] synchroniseBuffer(byte[] bytes) {
int count = sizeSynchronisationWouldSubtract(bytes);
if (count == 0) return bytes;
byte[] newBuffer = new byte[bytes.length - count];
int i = 0;
for (int j = 0; j < newBuffer.length - 1; j++) {
newBuffer[j] = bytes[i];
if (bytes[i] == -0x01 && bytes[i + 1] == 0 && ((bytes[i + 2] & -0x20) == -0x20 || bytes[i + 2] == 0)) {
i++;
}
i++;
}
newBuffer[newBuffer.length - 1] = bytes[i];
return newBuffer;
}
public static String substitute(String s, String replaceThis, String withThis) {
if (replaceThis.length() < 1 || s.indexOf(replaceThis) < 0) {
return s;
}
StringBuffer newString = new StringBuffer();
int lastPosition = 0;
int position = 0;
while ((position = s.indexOf(replaceThis, position)) >= 0) {
if (position > lastPosition) {
newString.append(s.substring(lastPosition, position));
}
if (withThis != null) {
newString.append(withThis);
}
lastPosition = position + replaceThis.length();
position++;
}
if (lastPosition < s.length()) {
newString.append(s.substring(lastPosition));
}
return newString.toString();
}
public static String asciiOnly(String s) {
StringBuffer newString = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (ch < 32 || ch > 126) {
newString.append('?');
} else {
newString.append(ch);
}
}
return newString.toString();
}
}