Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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
C# 如何将int转换为字节数组';然后回来?_C#_.net_Lua_Byte - Fatal编程技术网

C# 如何将int转换为字节数组';然后回来?

C# 如何将int转换为字节数组';然后回来?,c#,.net,lua,byte,C#,.net,Lua,Byte,我需要通过网络流发送一个整数。问题是我只能发送字节。 这就是为什么我需要将整数拆分为四个字节,然后发送这些字节,然后在另一端将其转换回整数 现在我只需要C#中的这个。但是对于最后一个项目,我需要将四个字节转换为Lua中的int [编辑] 卢阿怎么样?试试看 BitConverter.GetBytes() 请记住,返回数组中字节的顺序取决于系统的endianness 编辑: 至于Lua部分,我不知道如何转换回去。您总是可以乘以16得到与按位移位4相同的功能。它并不漂亮,我可以想象有一些库或实现它

我需要通过网络流发送一个整数。问题是我只能发送字节。 这就是为什么我需要将整数拆分为四个字节,然后发送这些字节,然后在另一端将其转换回整数

现在我只需要C#中的这个。但是对于最后一个项目,我需要将四个字节转换为Lua中的int

[编辑] 卢阿怎么样?

试试看

BitConverter.GetBytes()

请记住,返回数组中字节的顺序取决于系统的endianness

编辑: 至于Lua部分,我不知道如何转换回去。您总是可以乘以16得到与按位移位4相同的功能。它并不漂亮,我可以想象有一些库或实现它的东西。同样,添加字节的顺序取决于endianness,因此您可能需要仔细阅读


也许您可以在C#?

中转换回BinaryWriter/BinaryReader类

将int转换为字节数组并显示:BitConverter

www.java2s.com/Tutorial/CSharp/0280_uudevelopment/convertanintotoabytearrayanddisplay.htm

整数到字节-Visual Basic.NET答案

如何:将字节数组转换为整数(C#编程指南)


正如Nubsis所说,
位转换器
是合适的,但没有保证端性

我有一个
EndianBitConverter
类,允许您指定endianness。当然,如果您只想对单个数据类型(
int
)执行此操作,您可以手工编写代码


BinaryWriter
是另一个选项,这确实保证了很少的结尾。(同样,如果您需要其他选项,MiscUtil有一个
EndianBinaryWriter

位转换器是最简单的方法,但是如果您想要控制字节的顺序,您可以自己进行位移位

int foo = int.MaxValue;
byte lolo = (byte)(foo & 0xff);
byte hilo = (byte)((foo >> 8) & 0xff);
byte lohi = (byte)((foo >> 16) & 0xff);
byte hihi = (byte)(foo >> 24);
还有。。BitConverter的实现使用了不安全的和指针,但它又短又简单

public static unsafe byte[] GetBytes(int value)
{
   byte[] buffer = new byte[4];
   fixed (byte* numRef = buffer)
   {
      *((int*) numRef) = value;
   }
   return buffer;
}

转换为字节[]:

BitConverter.GetBytes(int)

要转换回整数:

位转换器.ToInt32(字节数组,偏移量)

但我不确定Lua的情况

如果您担心endianness,请使用John Skeet的EndianBitConverter。我已经使用过它,它可以无缝工作

C#支持他们自己实施HTON和NTOH,具体如下:


但是它们只在有符号的int16,int32,int64上工作,这意味着你可能会做很多不必要的转换来让它们工作,如果你用最高阶位来做除整数签名以外的任何事情,你就完蛋了。曾经去过那里,做过那件事:tsk:::tsk::Microsoft没有在.NET中提供更好的尾数转换支持。

这里是Lua中的一些函数,用于将32位2的补码转换为字节,并将4个字节转换为32位2的补码。可以/应该做更多的检查来验证传入参数是否有效

-- convert a 32-bit two's complement integer into a four bytes (network order)
function int_to_bytes(n)
  if n > 2147483647 then error(n.." is too large",2) end
  if n < -2147483648 then error(n.." is too small",2) end
  -- adjust for 2's complement
  n = (n < 0) and (4294967296 + n) or n
  return (math.modf(n/16777216))%256, (math.modf(n/65536))%256, (math.modf(n/256))%256, n%256
end

-- convert bytes (network order) to a 32-bit two's complement integer
function bytes_to_int(b1, b2, b3, b4)
  if not b4 then error("need four bytes to convert to int",2) end
  local n = b1*16777216 + b2*65536 + b3*256 + b4
  n = (n > 2147483647) and (n - 4294967296) or n
  return n
end

print(int_to_bytes(256)) --> 0 0 1 0
print(int_to_bytes(-10)) --> 255 255 255 246
print(bytes_to_int(255,255,255,246)) --> -10
--将32位2的补码整数转换为4字节(网络顺序)
函数int_到_字节(n)
如果n>2147483647,则错误(n.“太大”,2)结束
如果n<-2147483648,则错误(n.“太小”,2)结束
--调整为2的补码
n=(n<0)和(4294967296+n)或n
返回(math.modf(n/16777216))%256,(math.modf(n/65536))%256,(math.modf(n/256))%256,n%256
结束
--将字节(网络顺序)转换为32位2的补码整数
函数字节_到_int(b1、b2、b3、b4)
如果不是b4,则错误(“需要四个字节转换为int”,2)结束
本地n=b1*16777216+b2*65536+b3*256+b4
n=(n>2147483647)和(n-4294967296)或n
返回n
结束
打印(整数到字节(256))-->0
打印(整数到字节(-10))-->255 246
打印(字节到整数(255255246))-->-10

有关Lua,请查看Roberto的图书馆。(Roberto是Lua的作者之一。)它比所讨论的具体情况更一般,但交换
int
的需要很快就需要交换其他简单类型或更大的结构

假设两端的本机字节顺序都是可接受的(顺便说一句,这可能是一个错误的假设),那么您可以使用以下命令将数字转换为4字节整数:

buffer = struct.pack("l", value)
然后又回来了:

值=结构解包(“l”,缓冲区)

在这两种情况下,
buffer
都是包含字节的Lua字符串。如果需要从Lua访问单个字节值,
string.byte
是您的朋友

要指定压缩数据的字节顺序,请将big-endian的格式从
“l”
更改为
“l”


struct
模块是用C实现的,必须先编译成DLL或平台的等效文件,然后Lua才能使用它。这就是说,它包含在自带电池的安装软件包中,这是在Windows系统上安装Lua的一种流行方式。

为Lua方面提出一个单独的(但相关的)问题,以便这些答案明显独立于C答案……这是一个很好的答案,尽管我个人从未遵循Lua风格(…和…)或作业。在这种情况下使用just if对我来说很好。我也更喜欢这种方法,因为BitConverter不重用现有数组(例如ref byte[]),而是总是创建一个新数组-我想这会在需要进行多次转换时影响性能。