将字节数组从小端转换为大端,反之亦然

时间:2011-01-10 16:59:24

标签: c#-4.0 endianness

如何将字节数组Byte []从小端转换为大端。

我正在考虑将这个程序移植到Mono,并且想知道最好的方法。任何帮助,将不胜感激。

编辑:我正在读取寡妇和单声道文件。

感谢。 鲍勃。

4 个答案:

答案 0 :(得分:4)

除非您知道byte[]中的内容,否则无法“将byte[]转换为大端”。例如,2字节整数需要交换它们的两个字节,而4字节整数需要将它们的4个字节反转。如果数组只包含一个整数,则反转元素将起作用。如果不是,您将需要单独处理数组中包含的每个不同实体。

Mono.DataConvert是一个可以在这里提供帮助的库,如果您知道需要将数组的哪些段视为什么类型的数据类型。我强烈建议您查看这个图书馆;我在几个项目中使用它,它非常漂亮。它甚至被MIT许可并包含在一个源文件中,因此您可以直接将其编译为您正在构建的任何程序集。

答案 1 :(得分:2)

嗯,我觉得这里有问题。字节数组很少是固有的大端或小端。一个字节几乎总是以字节序独立。你可能想要的是纠正字节数组中包含的整数,字符等的字节顺序。

为了做到这一点,你必须首先确定构成所述整数,字符等的字节,然后翻转这些字节。简单地翻转/反转整个数组可能不起作用(除非整个数组代表一个整数,char等)。

使用Array.Reverse()方法的以下重载来执行您想要的操作...

public static void Reverse(
    Array array,
    int index,
    int length
)

答案 2 :(得分:1)

就我而言,我需要将给定的密钥(已经是小端格式)转换为大端字符串。它比我想象的要容易,并且不需要移位字节。这是我用来测试它的一个简单的控制台应用程序:

class LoginPageObect {
 let userNameTextField  = XCUIApplication().textFields["UserName"]
 let passwordTextField = XCUIApplication().textFields["Password"]
 let loginButton = XCUIApplication().buttons["LOG IN"]

  func loginUser(testcase: XCTestCase) {
    testcase.waitForElementToAppear(userNameTextField)
    testcase.waitForElementToAppear(passwordTextField)
    userNameTextField.tap()
    userNameTextField.clearText()
    userNameTextField.typeText("Shahid")

    passwordTextField.tap()
    passwordTextField.clearText()
    passwordTextField.typeText("xxxxx")

    loginButton.tap()

   }
 }

class UserProfilePageObject {
 let userNameCell  =   XCUIApplication().tables.cells.staticTexts["Shahid"]


 func navigateToUserProfile(testcase: XCTestCase) {
   let loginPage = LoginPageObect()
   logingPage.loginUser(testCase)
   testcase.waitForElementToAppear(userNameCell)
   userNameCell.tap()
 }
}

给定的示例在控制台中打印出来:

原键:B13E7455-9965-4841-172F-741A662880D4

Big-endian版本的密钥:55743eb165994148172f741a662880d4

你可以在这里找到一个工作小提琴:https://realm.io/docs/swift/latest/#configuring-the-default-realm

答案 3 :(得分:0)

您想要反转数组中的项目,还是字节本身的值?如果只是数组,那么您可以使用Array.Reverse()