返回提交历史
Modified
docs/misc/bvid_desc.md
+66
-0
XFEstudio/bilibili-API-collect
feat: bv<-->av algo implemented in golang (#1027)
Co-authored-by: wsh <3443327820@qq.com>
ce07d83
代码差异
1 个文件
+66
-0
@@ -328,6 +328,71 @@ public class AVBVConverter {
328
328
329
329
```
330
330
331
332
### Golang
333
334
```go
335
package main
336
337
import (
338
"fmt"
339
"strings"
340
)
341
342
var (
343
XOR_CODE = int64(23442827791579)
344
MAX_CODE = int64(2251799813685247)
345
CHARTS = "FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf"
346
PAUL_NUM = int64(58)
347
)
348
349
func swapString(s string, x, y int) string {
350
chars := []rune(s)
351
chars[x], chars[y] = chars[y], chars[x]
352
return string(chars)
353
}
354
355
func Bvid2Avid(bvid string) (avid int64) {
356
s := swapString(swapString(bvid, 3, 9), 4, 7)
357
bv1 := string([]rune(s)[3:])
358
temp := int64(0)
359
for _, c := range bv1 {
360
idx := strings.IndexRune(CHARTS, c)
361
temp = temp*PAUL_NUM + int64(idx)
362
}
363
avid = (temp & MAX_CODE) ^ XOR_CODE
364
return
365
}
366
367
func Avid2Bvid(avid int64) (bvid string) {
368
arr := [12]string{"B", "V", "1"}
369
bvIdx := len(arr) - 1
370
temp := (avid | (MAX_CODE + 1)) ^ XOR_CODE
371
for temp > 0 {
372
idx := temp % PAUL_NUM
373
arr[bvIdx] = string(CHARTS[idx])
374
temp /= PAUL_NUM
375
bvIdx--
376
}
377
raw := strings.Join(arr[:], "")
378
bvid = swapString(swapString(raw, 3, 9), 4, 7)
379
return
380
}
381
382
func main() {
383
avid := int64(1054803170)
384
bvid := "BV1mH4y1u7UA"
385
resAvid := Bvid2Avid(bvid)
386
resBvid := Avid2Bvid(avid)
387
388
fmt.Printf("convert bvid to avid: %v\tvalue:%v\n", avid == resAvid, resAvid)
389
fmt.Printf("convert avid to bvid: %v\tvalue:%v\n", bvid == resBvid, resBvid)
390
391
}
392
393
```
394
395
331
396
### C++
332
397
```c++
333
398
#include <algorithm>
@@ -387,6 +452,7 @@ int main() {
387
452
```
388
453
389
454
455
390
456
## 老版算法存档
391
457
392
458
**以下算法已失效**,编解码函数值域有限,不推荐使用,在此仅作为存档