Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于套接字的Python C#数据类型_Python_Python 3.x_Types_Casting - Fatal编程技术网

用于套接字的Python C#数据类型

用于套接字的Python C#数据类型,python,python-3.x,types,casting,Python,Python 3.x,Types,Casting,我正在创建一个套接字服务器,通过TCP与C#程序连接和对话。目前,我正在尝试创建一种方法,将通过TCP套接字发送的十六进制转换为特定的变量(变量类型将在数据包头中,是的,我知道TCP是一个从技术上讲不发送数据包的流,但我是这样设计的)。目前,我已经通过下面的代码将所有的C#integral数字类型正确地转换为bytesarray/整数和从bytesarray/整数转换为bytesarray/整数(所有不同的类型都是相同的,只需进行一些编辑以适应C#type) ##SBYTE类型类定义 ##C#/

我正在创建一个套接字服务器,通过TCP与C#程序连接和对话。目前,我正在尝试创建一种方法,将通过TCP套接字发送的十六进制转换为特定的变量(变量类型将在数据包头中,是的,我知道TCP是一个从技术上讲不发送数据包的流,但我是这样设计的)。目前,我已经通过下面的代码将所有的C#integral数字类型正确地转换为bytesarray/整数和从bytesarray/整数转换为bytesarray/整数(所有不同的类型都是相同的,只需进行一些编辑以适应C#type)

##SBYTE类型类定义
##C#/Unity“sbyte”可以是-128到127
##
##用法:
##
##建造师
##变量=sbyte(整数)
##变量=sbyte(bytearray)
## 
##变数
##sbyte.integer(返回整数表示)
##sbyte.bytes(返回字节数组表示)
sbyte类:
定义初始化(自我,输入):
如果类型(输入)=类型(int()):
self.integer=输入
self.bytes=self.\u toBytes(输入)
elif类型(输入)=类型(bytearray()):
self.bytes=输入
self.integer=self.\u\t输入(输入)
其他:
raise TypeError(f“sbyte构造函数可以采用integer或bytearray类型而不是{type(input)}”)
##从字节数组返回整数
定义(自身、byteArray):
##检查是否只有1个字节
如果len(byteArray)!=1:
raise OverflowError(f“sbyte.u toInt长度只能是1字节,而不是{len(byteArray)}字节”)
##返回有符号整数
返回int.from_字节(byteArray,byteorder='little',signed=True)
##从整数返回字节数组
定义字节(自身,整数):
##检查传递的整数是否不大于128且不小于-128
如果整数>127或整数<-128:
raise VALUETERROR(f“sbyte.\u toBytes只能接受小于或等于127、大于或等于-128的整数,而不是\“{integer}\”)
##将传递的整数转换为字节
返回整数到字节(1,byteorder='little',signed=True)

这适用于我目前实现的所有类型,但我想知道是否有更好的方法来处理这一问题?例如使用ctype或其他一些python库。因为这将是一个具有潜在多个连接的套接字服务器,所以尽可能快地处理它是最好的。或者,如果您认为我还有什么可以改进的地方,我很想知道。

使用以下代码测试from_bytes、struct.unpack和numpy.frombuffer之间的差异:

setup1 = """\
byteArray = bytearray.fromhex('1E')
"""

setup2 = """\
import struct
byteArray = bytearray.fromhex('1E')
"""

setup3 = """\
import numpy as np
type = np.dtype(np.byte)
byteArray = bytearray.fromhex('1E')
"""

stmt1 = "int.from_bytes(byteArray, byteorder='little', signed=True)"
stmt2 = "struct.unpack('b', byteArray)"
stmt3 = "np.frombuffer(byteArray, type)"

print(f"First statement execution time = {timeit.timeit(stmt=stmt1, setup=setup1, number=10**8)}")
print(f"Second statement execution time = {timeit.timeit(stmt=stmt2, setup=setup2, number=10**8)}")
print(f"Third statement execution time = {timeit.timeit(stmt=stmt3, setup=setup3, number=10**8)}")
结果:

First statement execution time = 14.456886599999999
Second statement execution time = 6.671141799999999
Third statement execution time = 21.8327342
从最初的结果来看,struct似乎是实现这一点的最快方法。除非我还缺少其他的图书馆

编辑:

First statement execution time = 14.456886599999999
Second statement execution time = 6.671141799999999
Third statement execution time = 21.8327342
根据AKX的建议,我为有符号字节添加了以下测试:

stmt4 = """\
if byteArray[0] <=127:
    byteArray[0]
else:
    byteArray[0]-127
"""

走这条路是最快的,尽管比使用structs稍微快一点。我必须测试每种类型以获得最快的字节转换方法,反之亦然,但这个问题现在给了我4种不同的方法来测试每种类型。谢谢

使用以下代码测试from_bytes、struct.unpack和numpy.frombuffer之间的差异后:

setup1 = """\
byteArray = bytearray.fromhex('1E')
"""

setup2 = """\
import struct
byteArray = bytearray.fromhex('1E')
"""

setup3 = """\
import numpy as np
type = np.dtype(np.byte)
byteArray = bytearray.fromhex('1E')
"""

stmt1 = "int.from_bytes(byteArray, byteorder='little', signed=True)"
stmt2 = "struct.unpack('b', byteArray)"
stmt3 = "np.frombuffer(byteArray, type)"

print(f"First statement execution time = {timeit.timeit(stmt=stmt1, setup=setup1, number=10**8)}")
print(f"Second statement execution time = {timeit.timeit(stmt=stmt2, setup=setup2, number=10**8)}")
print(f"Third statement execution time = {timeit.timeit(stmt=stmt3, setup=setup3, number=10**8)}")
结果:

First statement execution time = 14.456886599999999
Second statement execution time = 6.671141799999999
Third statement execution time = 21.8327342
从最初的结果来看,struct似乎是实现这一点的最快方法。除非我还缺少其他的图书馆

编辑:

First statement execution time = 14.456886599999999
Second statement execution time = 6.671141799999999
Third statement execution time = 21.8327342
根据AKX的建议,我为有符号字节添加了以下测试:

stmt4 = """\
if byteArray[0] <=127:
    byteArray[0]
else:
    byteArray[0]-127
"""

走这条路是最快的,尽管比使用structs稍微快一点。我必须测试每种类型以获得最快的字节转换方法,反之亦然,但这个问题现在给了我4种不同的方法来测试每种类型。谢谢

如果只需要字节数组中的整数值,只需为字节数组编制索引:

>>> b = bytearray.fromhex('1E')
>>> b[0]
30

如果只需要字节数组中的整数值,只需为字节数组编制索引:

>>> b = bytearray.fromhex('1E')
>>> b[0]
30

您真的是通过套接字发送十六进制(即0-9a-f范围内的ASCII字符)还是原始字节?如果您希望速度更快,请不要自行进行序列化/反序列化;使用例如Msgpack、BSON…您真的是通过套接字发送十六进制(即0-9a-f范围内的ASCII字符)还是原始字节?如果您希望速度更快,请不要自行进行序列化/反序列化;使用例如Msgpack,BSON,…来处理一些可以工作的未签名类型,但我认为这对签名类型不起作用。例如示例中的sbyte。例如,如果执行fromhex('F3'),则b[0]将不是有符号字节,而是返回243。除非有别的办法?虽然对于无符号类型,我会非常快地测试它,看看它是否比struct快。如果你想让它有符号,减去127。如果我用bytearray.fromhex('F3')[0],它返回243,如果你减去127,那就是116。十六进制'F3'的C#sbyte将返回-13。对不起,我的意思是减去256。这种工作方式,但例如有符号字节的十六进制7F应等于127。相反,它最初返回127,这是正确的,但如果你减去256,我得到-129。我可以检查一下这个值是否超过127,然后减去256。我现在正在用timeit测试它。如果是最快的,我会记下你的答案!对于一些未签名的类型,这将起作用,但我认为这对签名类型不起作用。例如示例中的sbyte。例如,如果执行fromhex('F3'),则b[0]将不是有符号字节,而是返回243。除非有别的办法?虽然对于无符号类型,我会非常快地测试它,看看它是否比struct快。如果你想让它有符号,减去127。如果我用bytearray.fromhex('F3')[0],它返回243,如果你减去127,那就是116。十六进制'F3'的C#sbyte将返回-13。对不起,我的意思是减去256。这种工作方式,但例如有符号字节的十六进制7F应等于127。相反,它最初返回127,这是正确的,但如果你减去256,我得到-129。我可以做一个检查,看看值