XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/bilibili-API-collect

feat: bv<-->av 增加java实现 (#1021)

11d4285
cctyl <34262992+cctyl@users.noreply.github.com>
提交于

代码差异

1 个文件 +81 -0
Modified docs/misc/bvid_desc.md +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 **以下算法已失效**,编解码函数值域有限,不推荐使用,在此仅作为存档