You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

100 lines
2.9 KiB
Python

2 years ago
import struct
2 years ago
def reorderBytes(byteStream, format):
if format == 'ABCD':
return byteStream[::-1]
2 years ago
elif format == 'DCBA':
return byteStream
2 years ago
elif format == 'BADC':
return bytes([byteStream[2], byteStream[3], byteStream[0], byteStream[1]])
2 years ago
elif format == 'CDAB':
return bytes([byteStream[1], byteStream[0], byteStream[3], byteStream[2]])
2 years ago
else:
raise ValueError("Invalid format")
2 years ago
# 大端模式
def floatToABCD(value):
valueByte = struct.unpack('>HH',struct.pack('>f', value))
return valueByte
# 小端模式
def floatToDCBA(value):
valueByte = struct.unpack('>HH', struct.pack('<f', value))
return valueByte
# 单字反转
def floatToBADC(value):
valueByte = struct.unpack('<HH', struct.pack('>f', value))
return valueByte
# 双字反转
def floatToCDAB(value):
valueByte = struct.unpack('<HH', struct.pack('<f', value))
return valueByte
def ABCDToFloat(value):
valueByte = struct.unpack('>f',struct.pack('>HH', value[0], value[1]))
return valueByte[0]
# 小端模式
def DCBAToFloat(value):
valueByte = struct.unpack('<f', struct.pack('>HH', value[0], value[1]))
return valueByte[0]
def BADCToFloat(value):
valueByte = struct.unpack('>f', struct.pack('<HH', value[0], value[1]))
return valueByte[0]
def CDABToFloat(value):
valueByte = struct.unpack('<f', struct.pack('<HH', value[0], value[1]))
return valueByte[0]
2 years ago
2 years ago
def bytesTOFloat(value, order):
match order:
case 'ABCD':
return ABCDToFloat(value)
case 'DCBA':
return DCBAToFloat(value)
case 'CDAB':
return CDABToFloat(value)
case 'BADC':
return BADCToFloat(value)
2 years ago
def floatToBytes(values, length, order):
# 判断order是否为ABCD或BADC
# order = '>' if order in ['ABCD', 'BADC'] else '<'
# hOrder = '<'if order.byte in ['ABCD', 'DCBA'] else '>'
# 获取values的长度
valuesNums = len(values)
2 years ago
# print(values,valuesNums,6666)
2 years ago
# 将values转换为字节流
valueByte = struct.pack(f"!{'f' * valuesNums}", *values)
2 years ago
valueByte = reorderBytes(valueByte, format = order) + struct.pack('B' * (length - valuesNums * 4), *[0] * (length - valuesNums * 4))
2 years ago
# {'B' * (length - 4 * valuesNums) *[0] * (length - 4 * valuesNums)
2 years ago
# print(valueByte)
2 years ago
# 返回转换后的字节流
2 years ago
return valueByte
2 years ago
def coilsToBytes(values, length):
decimalNumbers = []
binaryNumber = ''.join([str(x) for x in list(reversed(values))])
zeroNeeded = 0 if len(binaryNumber) % 8 == 0 else 8 - (len(binaryNumber) % 8)
binaryNumber = '0' * zeroNeeded + binaryNumber
for i in range(0, len(binaryNumber), 8):
eightValues = binaryNumber[i:i+8]
decimalNumbers.append(int(eightValues, 2))
valueByte = struct.pack("B" * length, *decimalNumbers, *[0] * (length - len(decimalNumbers)))
return valueByte
2 years ago
def bytesToCoils(valueByte):
binaryNumber = ''.join([format(x, '08b') for x in valueByte])
values = list(reversed([int(x) for x in binaryNumber]))
2 years ago
# print(values)
2 years ago
return values
2 years ago