for (j = 0; j < 8; j++) { if ((nData[0] ^ nAccum[0]) & 0x80000000) { nAccum[0] = ((nAccum[0] << 1) | ((nAccum[1] & 0x80000000) >> 31)) ^ 0x42F0E1EB; nAccum[1] = (nAccum[1] << 1) ^ 0xA9EA3693; } else { nAccum[0] = (nAccum[0] << 1) | ((nAccum[1] & 0x80000000) >> 31); nAccum[1] = nAccum[1] << 1; } nData[0] = (nData[0] << 1) | ((nData[1] & 0x80000000) >> 31); nData[1] = nData[1] << 1; }
时间: 2023-12-31 17:04:11 浏览: 27
这段代码是计算 CRC 校验值的核心部分,使用的是移位异或法。具体地,对于每一个输入数据的字节,将其二进制表示的每一位依次与 CRC 累加值进行异或运算。如果异或的结果最高位为 1,则将 CRC 累加值左移一位后再与一个固定值 0x42F0E1EB 异或;否则,直接将 CRC 累加值左移一位。同时,将输入数据的二进制表示左移一位。重复执行 8 次,最后得到的 CRC 累加值即为该数据的 CRC 校验值。
相关问题
// 构造64位CRC 表 nData[0] = 0; nData[1] = 0; for (i = 0; i < 256; i++) { nAccum[0] = 0; nAccum[1] = 0; nData[1] = i; nData[0] = nData[1] << 24; nData[1] = 0;
这段代码是构造一个 64 位的 CRC 校验表。首先,将 nData 数组的两个元素初始化为 0。然后,对于 0 到 255 的每个数,计算它的 CRC 校验值。具体地,将 nAccum 数组的两个元素初始化为 0,将 nData 数组的第二个元素设置为当前数,将 nData 数组的第一个元素设置为第二个元素左移 24 位,然后进行一系列的位运算操作,将结果存储到 nAccum 数组中。最后,将计算出的 CRC 校验值存储到 TableCRCHigh 和 TableCRCLow 数组中,其中,TableCRCHigh 存储的是高位的校验值,TableCRCLow 存储的是低位的校验值。
import os import sys import numpy as np def creat_pcd(input_path, output_path): #Lodaing txt Full_Data = np.loadtxt(input_path) #Creating pcd if os.path.exists(output_path): os.remove(output_path) Output_Data = open(output_path, 'a') Output_Data.write('# .PCD v0.7 - Point Cloud Data file format\nVERSION 0.7\nFIELDS x y z rgba\nSIZE 4 4 4 4\nTYPE F F F U\nCOUNT 1 1 1 1') string = '\nWIDTH ' + str(Full_Data.shape[0]) Output_Data.write(string) Output_Data.write('\nHEIGHT 1\nVIEWPOINT 0 0 0 1 0 0 0') string = '\nPOINTS ' + str(Full_Data.shape[0]) Output_Data.write(string) Output_Data.write('\nDATA ascii') for j in range(Full_Data.shape[0]): R=Full_Data[j,1] G=Full_Data[j,1] B=Full_Data[j,2] value = (int(R) << 16 | int(G) << 8 | int(B)) string = ('\n' + str(Full_Data[j,0]) + ' ' + str(Full_Data[j, 1]) + ' ' +str(Full_Data[j, 2]) + ' ' + str(value)) Output_Data.write(string) Output_Data.close() print('--------------Completed--------------') a = input("请输入TXT文件路径:")#文件路径中斜杆使用"/",比如:D:/pcl/points.txt b = input("请输入PCD文件保存路径:")#比如:D:/pcl/points.pcd creat_pcd(a, b)对这些代码优化
以下是对代码的优化建议:
1. 引入模块应当分行,不要写在同一行。
2. 应使用 with 语句打开文件,可以自动关闭文件,避免忘记关闭文件而导致资源泄露。
3. 在写入文件时应当使用字符串格式化来避免繁琐的字符串拼接操作,提高代码可读性。
4. 变量名应该具有具体的描述性,便于代码阅读和理解。
5. 字段名称和数据类型定义可以提取为常量或变量,便于修改和维护。
6. 可以使用 argparse 模块来处理命令行参数,更加方便用户使用。
下面是优化后的代码:
```python
import os
import sys
import argparse
import numpy as np
PCD_FIELDS = ['x', 'y', 'z', 'rgba']
PCD_SIZE = [4, 4, 4, 4]
PCD_TYPE = ['F', 'F', 'F', 'U']
PCD_COUNT = [1, 1, 1, 1]
PCD_VERSION = '0.7'
def create_pcd(input_path, output_path):
# Loading txt
full_data = np.loadtxt(input_path)
# Creating pcd
if os.path.exists(output_path):
os.remove(output_path)
with open(output_path, 'a') as output_data:
output_data.write(f"# .PCD v{PCD_VERSION} - Point Cloud Data file format\n")
output_data.write("VERSION {}\n".format(PCD_VERSION))
output_data.write("FIELDS {}\n".format(" ".join(PCD_FIELDS)))
output_data.write("SIZE {}\n".format(" ".join(map(str, PCD_SIZE))))
output_data.write("TYPE {}\n".format(" ".join(PCD_TYPE)))
output_data.write("COUNT {}\n".format(" ".join(map(str, PCD_COUNT))))
output_data.write("WIDTH {}\n".format(full_data.shape[0]))
output_data.write("HEIGHT 1\n")
output_data.write("VIEWPOINT 0 0 0 1 0 0 0\n")
output_data.write("POINTS {}\n".format(full_data.shape[0]))
output_data.write("DATA ascii\n")
for j in range(full_data.shape[0]):
r = full_data[j, 1]
g = full_data[j, 1]
b = full_data[j, 2]
value = (int(r) << 16 | int(g) << 8 | int(b))
output_data.write("{:.6f} {:.6f} {:.6f} {:d}\n".format(full_data[j, 0], full_data[j, 1], full_data[j, 2], value))
print('--------------Completed--------------')
def parse_args():
parser = argparse.ArgumentParser(description='Convert txt file to pcd file.')
parser.add_argument('input_path', type=str, help='input txt file path')
parser.add_argument('output_path', type=str, help='output pcd file path')
return parser.parse_args()
if __name__ == '__main__':
args = parse_args()
create_pcd(args.input_path, args.output_path)
```
使用 argparse 模块可以从命令行方便地输入文件路径,例如:
```bash
python create_pcd.py D:/pcl/points.txt D:/pcl/points.pcd
```
相关推荐
![unitypackage](https://img-home.csdnimg.cn/images/20210720083646.png)
![unitypackage](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)