返回提交历史
Modified
docs/misc/bvid_desc.md
+81
-0
XFEstudio/bilibili-API-collect
feat: bv<-->av 增加java实现 (#1021)
11d4285
代码差异
1 个文件
+81
-0
@@ -248,6 +248,87 @@ print(av2bv(avid: 111298867365120))
248
248
print(bv2av(bvid: "BV1L9Uoa9EUx"))
249
249
```
250
250
251
252
### Java
253
254
```
255
import java.math.BigInteger;
256
257
/**
258
* @author cctyl
259
*/
260
public class AVBVConverter {
261
262
private static final BigInteger XOR_CODE = BigInteger.valueOf(23442827791579L);
263
private static final BigInteger MASK_CODE = BigInteger.valueOf(2251799813685247L);
264
private static final BigInteger MAX_AID = BigInteger.ONE.shiftLeft(51);
265
private static final int BASE = 58;
266
267
private static final String DATA = "FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf";
268
269
public static String av2bv(int aidParam) {
270
271
BigInteger aid = BigInteger.valueOf(aidParam);
272
char[] bytes = {'B', 'V', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0'};
273
int bvIndex = bytes.length - 1;
274
BigInteger tmp = MAX_AID.or(aid).xor(XOR_CODE);
275
while (tmp.compareTo(BigInteger.ZERO) > 0) {
276
bytes[bvIndex] = DATA.charAt(tmp.mod(BigInteger.valueOf(BASE)).intValue());
277
tmp = tmp.divide(BigInteger.valueOf(BASE));
278
bvIndex -= 1;
279
}
280
swap(bytes, 3, 9);
281
swap(bytes, 4, 7);
282
StringBuilder sb = new StringBuilder(bytes.length);
283
for (Character ch : bytes) {
284
sb.append(ch);
285
}
286
return sb.toString();
287
}
288
289
public static int bv2av(String bvid) {
290
char[] bvidArr = bvid.toCharArray();
291
swap(bvidArr, 3, 9);
292
swap(bvidArr, 4, 7);
293
String adjustedBvid = new String(bvidArr, 3, bvidArr.length - 3);
294
BigInteger tmp = BigInteger.ZERO;
295
for (char c : adjustedBvid.toCharArray()) {
296
tmp = tmp.multiply(BigInteger.valueOf(BASE)).add(BigInteger.valueOf(DATA.indexOf(c)));
297
}
298
BigInteger xor = tmp.and(MASK_CODE).xor(XOR_CODE);
299
return xor.intValue();
300
}
301
302
303
private static void swap(char[] array, int i, int j) {
304
char temp = array[i];
305
array[i] = array[j];
306
array[j] = temp;
307
}
308
309
public static void main(String[] args) {
310
311
final int aid1 = 643755790;
312
final String bv1 = "BV1bY4y1j7RA";
313
314
final int aid2 = 305988942;
315
final String bv2 = "BV1aP411K7it";
316
317
318
//av ==> bv
319
assert av2bv(aid1).equals(bv1);
320
assert av2bv(aid2).equals(bv2);
321
322
323
//bv ==>av
324
assert bv2av(bv1) == aid1;
325
assert bv2av(bv2) == aid2;
326
}
327
}
328
329
```
330
331
251
332
## 老版算法存档
252
333
253
334
**以下算法已失效**,编解码函数值域有限,不推荐使用,在此仅作为存档